加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

使用Scala获取Spark数据集中与最新时间戳对应的行

发布时间:2020-12-16 18:21:19 所属栏目:安全 来源:网络整理
导读:我对Spark和 Scala相对较新.我有一个数据帧,其格式如下: | Col1 | Col2 | Col3 | Col_4 | Col_5 | Col_TS | Col_7 | | 1234 | AAAA | 1111 | afsdf | ewqre | 1970-01-01 00:00:00.0 | false || 1234 | AAAA | 1111 | ewqrw | dafda | 2017-01-17 07:09:32.
我对Spark和 Scala相对较新.我有一个数据帧,其格式如下:

| Col1 | Col2 | Col3 | Col_4 | Col_5 | Col_TS                  | Col_7 | 

| 1234 | AAAA | 1111 | afsdf | ewqre | 1970-01-01 00:00:00.0   | false |
| 1234 | AAAA | 1111 | ewqrw | dafda | 2017-01-17 07:09:32.748 | true  |
| 1234 | AAAA | 1111 | dafsd | afwew | 2015-01-17 07:09:32.748 | false |
| 5678 | BBBB | 2222 | afsdf | qwerq | 1970-01-01 00:00:00.0   | true  |
| 5678 | BBBB | 2222 | bafva | qweqe | 2016-12-08 07:58:43.04  | false |
| 9101 | CCCC | 3333 | caxad | fsdaa | 1970-01-01 00:00:00.0   | false |

我需要做的是获取与最新时间戳对应的行.
在上面的示例中,键是Col1,Col2和Col3. Col_TS表示时间戳,Col_7是一个布尔值,用于确定记录的有效性.
我想要做的是找到一种方法来根据键对这些记录进行分组,并保留具有最新时间戳的记录.

所以上面数据帧中的操作输出应该是:

| Col1 | Col2 | Col3 | Col_4 | Col_5 | Col_TS                  | Col_7 | 

| 1234 | AAAA | 1111 | ewqrw | dafda | 2017-01-17 07:09:32.748 | true  |
| 5678 | BBBB | 2222 | bafva | qweqe | 2016-12-08 07:58:43.04  | false |
| 9101 | CCCC | 3333 | caxad | fsdaa | 1970-01-01 00:00:00.0   | false |

我提出了一个部分解决方案,但这样我只能返回记录被分组的列键的数据帧,而不是其他列.

df = df.groupBy("Col1","Col2","Col3").agg(max("Col_TS"))


| Col1 | Col2 | Col3 | max(Col_TS)             |

| 1234 | AAAA | 1111 | 2017-01-17 07:09:32.748 |
| 5678 | BBBB | 2222 | 2016-12-08 07:58:43.04  | 
| 9101 | CCCC | 3333 | 1970-01-01 00:00:00.0   |

有人可以帮我提出用于执行此操作的Scala代码吗?

解决方法

您可以使用窗口功能如下

import org.apache.spark.sql.functions._
val windowSpec = Window.partitionBy("Col1","Col3").orderBy(col("Col_TS").desc)

df.withColumn("maxTS",first("Col_TS").over(windowSpec))
.select("*").where(col("maxTS") === col("Col_TS"))
.drop("maxTS")
  .show(false)

你应该获得如下输出

+----+----+----+-----+-----+----------------------+-----+
|Col1|Col2|Col3|Col_4|Col_5|Col_TS                |Col_7|
+----+----+----+-----+-----+----------------------+-----+
|5678|BBBB|2222|bafva|qweqe|2016-12-0807:58:43.04 |false|
|1234|AAAA|1111|ewqrw|dafda|2017-01-1707:09:32.748|true |
|9101|CCCC|3333|caxad|fsdaa|1970-01-0100:00:00.0  |false|
+----+----+----+-----+-----+----------------------+-----+

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读