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

Select corresponding value of not included column in groupBy in spark dataframe in java

我有一个数据框如下

col1, col2, version_time, 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) 上进行聚合,并且 return 所有列。

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

如果我在 dataframe 上使用 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,我仍然会有 5 行的 col1 和 col2 具有相同的时间戳值,这不是我想要的。

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 使用 rank window 函数分区并根据时间戳对其进行排序,然后 select rank=1 的记录。 Spark sql 等效项将是这样的。

select * from (select col1,col2,rank() over(partition by col1,col2 order by timestamp desc) as rnk)temp where rnk=1