首页 > 解决方案 > 通过时间戳scala更新数据帧值

问题描述

我有这个数据框

+----------------+-----------------------------+--------------------+--------------+----------------+
|customerid|     |  event                      | A                  | B            |    C           |
+----------------+-----------------------------+--------------------+--------------+----------------+
|     1222222    | 2019-02-07 06:50:40.0       |aaaaaa              | 25           | 5025           |
|     1222222    | 2019-02-07 06:50:42.0       |aaaaaa              | 35           | 5000           |
|     1222222    | 2019-02-07 06:51:56.0       |aaaaaa              | 100          | 4965           |
+----------------+-----------------------------+--------------------+--------------+----------------+

我想按事件(tiemstamp)更新列 C 的值,并在新数据框中仅保留具有最新值更新的行,如下所示

+----------------+-----------------------------+--------------------+--------------+----------------+
|customerid|     |  event                      | A                  | B            |    C           |
+----------------+-----------------------------+--------------------+--------------+----------------+
|     1222222    | 2019-02-07 06:51:56.0       |aaaaaa              | 100          | 4965           |
+----------------+-----------------------------+--------------------+--------------+----------------+

数据以流模式进入火花流

标签: scalaapache-sparkdataframebigdataspark-streaming

解决方案


您可以尝试创建按 customerid 分区的行号并按事件 desc 排序并获取 rownum 为 1 的行。我希望这会有所帮助。

df.withColumn("rownum", row_number().over(Window.partitionBy("customerid").orderBy(col("event").desc)))
    .filter(col("rownum") === 1)
    .drop("rownum")

推荐阅读