【问题标题】:update dataframe value by timestamp scala通过时间戳scala更新数据帧值
【发布时间】:2019-07-11 18:49:26
【问题描述】:

我有这个数据框

+----------------+-----------------------------+--------------------+--------------+----------------+
|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           |
+----------------+-----------------------------+--------------------+--------------+----------------+

数据以带有火花流的流模式进入

【问题讨论】:

  • 到目前为止你做了什么?看起来您需要通过某个公共键 (groupBy) 对行进行分组,然后从每个组中获取具有最大时间戳的记录。然后映射每个组的剩余记录。
  • @AlexeyNovakov 是的,我有很多带有键的事件,我想通过时间戳和 C 的最后一个值自动获取最后一个事件

标签: scala apache-spark dataframe bigdata spark-streaming


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 2016-03-28
    • 2020-08-23
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    • 2017-09-08
    相关资源
    最近更新 更多