使用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_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| +----+----+----+-----+-----+----------------------+-----+ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |