【问题标题】:Select corresponding value of not included column in groupBy in spark dataframe in java [duplicate]在java中的spark数据框中选择groupBy中未包含列的相应值[重复]
【发布时间】:2021-08-20 03:35:31
【问题描述】:

我有一个如下的数据框

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

我想要的是 groupBy col1 和 col2 在 max(timestamp) 上聚合并返回所有列。

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,我仍然会有 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窗口函数分区并根据时间戳排序,然后选择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
  • @linusRian,感谢您的评论。你知道如何在Java中选择rank=1
  • 您可以使用 createOrReplaceTempView 读取数据帧并将其存储在临时表中,然后您可以使用 spark.sql("yourquerygoeshere") 执行上述查询。请参考链接..spark.apache.org/docs/2.1.0/…。您也可以使用dataframe api来完成。
  • 解决方案效果很好......谢谢
  • 太好了,不客气:)

标签: dataframe apache-spark apache-spark-sql spark-java


【解决方案1】:

您可以在 col1 和 col2 上使用 rank 窗口函数分区并根据时间戳对其进行排序,然后选择 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

【讨论】:

    猜你喜欢
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    相关资源
    最近更新 更多