Scala-Spark-如何获取具有数据框列的不同值以及此不同值的第一个日期的新数据框?

时间:2018-10-02 14:01:22

标签: scala apache-spark

我有一个具有以下架构的Spark数据框:

________________________
|id   | no  | date      |
|1    | 123 |2018/10/01 |
|2    | 124 |2018/10/01 |
|3    | 123 |2018/09/28 |
|4    | 123 |2018/09/27 |

... 我想要的是一个具有以下数据的新DataFrame:

___________________
| no  | date      |
| 123 |2018/09/27 |
| 124 |2018/10/01 |

有人可以帮我吗?:)谢谢!!

2 个答案:

答案 0 :(得分:0)

您可以通过使用Spark sql在数据帧上使用等级(https://databricks.com/blog/2015/07/15/introducing-window-functions-in-spark-sql.html)来解决该问题:

registerTempTable上使用sparkContext,例如df_temp_table

进行以下查询:

    select dftt.*,  
    dense_rank() OVER ( PARTITION BY dftt.no ORDER BY dftt.date DESC) AS Rank from 
    df_temp_table as dftt

您将获得以下数据框:

|id | no | date       | rank 
|1  | 123 |2018/10/01 | 1
|2  | 124 |2018/10/01 | 1
|3  | 123 |2018/09/28 | 2
|4  | 123 |2018/09/27 | 3 

在此df上,您现在可以按1过滤等级列

答案 1 :(得分:-1)

欢迎

您可以尝试以下代码:

import org.apache.spark.sql.functions.row_number
import org.apache.spark.sql.expressions.Window

val w = Window.partitionBy($"no").orderBy($"date".asc)
val Resultdf = df.withColumn("rownum", row_number.over(w))
     .where($"rownum" === 1).drop("rownum","id")

Resultdf.show()

输出:

+---+----------+
| no|      date|
+---+----------+
|124|2018/10/01|
|123|2018/09/27|
+---+----------+