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
我有一个数据框如下
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