选择java中spark dataframe中groupBy中未包含列的对应值
我有一个如下的数据帧 col1,col2,版本时间,col3选择java中spark dataframe中groupBy中未包含列的对应值,dataframe,apache-spark,apache-spark-sql,spark-java,Dataframe,Apache Spark,Apache Spark Sql,Spark Java,我有一个如下的数据帧 col1,col2,版本时间,col3 root |-- col1: string (nullable = true) |-- col2: integer (nullable = true) |-- version_time: timestamp (nullable = true) |-- col3: string (nullable = true) 下面是一些示例行 col1 col2 timestamp col3 1
root
|-- col1: string (nullable = true)
|-- col2: integer (nullable = true)
|-- version_time: timestamp (nullable = true)
|-- col3: string (nullable = true)
下面是一些示例行
col1 col2 timestamp col3
1 A 2021-05-09T13:53:20.219Z B
2 A 2021-01-09T13:53:20.219Z C
3 A 2021-02-09T13:53:20.219Z D
1 A 2020-05-09T13:53:20.219Z E
1 A 2019-05-09T13:53:20.219Z F
我想要的是通过col1和col2对max(timestamp)上的aggregate进行分组,并返回所有列
col1 col2 timestamp col3
1 A 2021-05-09T13:53:20.219Z B
2 A 2021-01-09T13:53:20.219Z C
3 A 2021-02-09T13:53:20.219Z D
如果在数据帧上使用groupBy,它将删除col3
。我将不得不加入原始数据帧以获得col3的值
col1 col2 timestamp
1 A 2021-05-09T13:53:20.219Z
2 A 2021-01-09T13:53:20.219Z
3 A 2021-02-09T13:53:20.219Z
如果我使用Window.partitionBy,对于col1和col2,我仍然有5行具有相同的时间戳值,这不是我想要的
col1 col2 timestamp col3
1 A 2021-05-09T13:53:20.219Z B
2 A 2021-01-09T13:53:20.219Z C
3 A 2021-02-09T13:53:20.219Z D
1 A 2021-05-09T13:53:20.219Z E
1 A 2021-05-09T13:53:20.219Z F
还有其他选择吗?您可以对col1和col2使用秩窗口函数分区,并根据时间戳对其进行排序,然后选择秩=1的记录。sparksql等价物是这样的
select * from (select col1,col2,rank() over(partition by col1,col2 order by timestamp desc) as rnk)temp where rnk=1
您可以在col1和col2上使用rank窗口函数分区,并根据时间戳对其进行排序,然后选择rank=1的记录。sparksql等价物是这样的。选择*from(选择col1,col2,rank()over(按col1分区,按时间戳desc排序)作为rnk)temp where rnk=1@linusRian,谢谢你的评论。您知道如何在Java中选择秩=1吗?您可以使用createOrReplaceTempView读取数据帧并将其存储在临时表中,然后使用spark.sql(“YourQueryGoesher”)执行上述查询。请参考链接。您也可以使用dataframe API来实现这一点。。谢谢上帝,不客气:)