【问题标题】:Spark DataFrame - Remove Rows with logicSpark DataFrame - 使用逻辑删除行
【发布时间】:2018-04-10 11:55:45
【问题描述】:

我需要下一个案例的帮助:

我有下一个 DataFrame

我需要删除CNTA_TIPODOCUMENTOS 和 CNTA_NRODOCUMENTO 重复的行,并按最后一个CNTA_FECHA_FORMULARIO 排序,例如在CNTA_NRODOCUMENTO 35468731 中。我应该得到这一行。

|                  1|         35468731| 2012-08-25 00:00:...|              MARIA| 

你对此有什么想法吗? 谢谢

【问题讨论】:

    标签: scala apache-spark functional-programming spark-dataframe


    【解决方案1】:

    一种方法是使用Window 函数row_number 以降序排列正确分区的日期,并且只选择每个分区的第一行:

    val df = Seq(
      (1, 80025709, "2010-07-19 00:00:00", "JUAN"),
      (1, 35468731, "2010-07-28 00:00:00", "PEDRO"),
      (1, 51714038, "2010-08-02 00:00:00", "ALEX"),
      (1, 35468731, "2011-09-28 00:00:00", "KAREN"),
      (1, 35468731, "2012-08-25 00:00:00", "MARIA")
    ).toDF("c1", "c2", "date", "name")
    
    import org.apache.spark.sql.functions._
    import org.apache.spark.sql.expressions.Window
    
    df.withColumn(
        "rownum",
        row_number.over(Window.partitionBy($"c1", $"c2").orderBy($"date".desc))
      ).
      select($"c1", $"c2", $"date", $"name").
      where($"rownum" === 1).
      show
    
    // +---+--------+-------------------+-----+
    // | c1|      c2|               date| name|
    // +---+--------+-------------------+-----+
    // |  1|51714038|2010-08-02 00:00:00| ALEX|
    // |  1|80025709|2010-07-19 00:00:00| JUAN|
    // |  1|35468731|2012-08-25 00:00:00|MARIA|
    // +---+--------+-------------------+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 2021-08-09
      • 1970-01-01
      • 2016-05-31
      • 2016-02-06
      相关资源
      最近更新 更多