选择java中spark dataframe中groupBy中未包含列的对应值

选择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

我有一个如下的数据帧

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     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来实现这一点。。谢谢上帝,不客气:)