scala - Spark - 在动态条件下从窗口中删除行
问题描述
这是我的数据框:
+------+------+-----------+---------+
| key1 | key2 | timestamp | status |
+------+------+-----------+---------+
| AAA | 111 | 1000 | event_a |
+------+------+-----------+---------+
| AAA | 111 | 1100 | null |
+------+------+-----------+---------+
| AAA | 111 | 1200 | event_b |
+------+------+-----------+---------+
| AAA | 111 | 1300 | null |
+------+------+-----------+---------+
| AAA | 222 | 1200 | event_a |
+------+------+-----------+---------+
| AAA | 222 | 1300 | event_b |
+------+------+-----------+---------+
| AAA | 222 | 1400 | null |
+------+------+-----------+---------+
| AAA | 222 | 1500 | null |
+------+------+-----------+---------+
我想通过key1
和key2
(可能使用窗口函数?)对行进行分组,然后从每个组中删除早于event_b
- 基于时间戳的行。
所以结果是:
+------+------+-----------+---------+
| key1 | key2 | timestamp | status |
+------+------+-----------+---------+
| AAA | 111 | 1000 | event_a |
+------+------+-----------+---------+
| AAA | 111 | 1100 | null |
+------+------+-----------+---------+
| AAA | 111 | 1200 | event_b |
+------+------+-----------+---------+
| AAA | 222 | 1200 | event_a |
+------+------+-----------+---------+
| AAA | 222 | 1300 | event_b |
+------+------+-----------+---------+
event_a
和之间可能有更多的状态event_b
,但总是event_b
最后一个,后面有空值。
我知道从数据框中删除元素是不可能的。我的意思是创建新的数据框。
解决方案
我认为您不需要窗口函数,即使您使用窗口函数,您也会对数据进行两次完整传递。一种方法是使用“event_b”行创建一个过滤的dataFrame,然后对其进行比较并根据时间戳保留所需的行。
val testDF = Seq(
("AAA", 111, 1000, "event_a"),
("AAA", 111, 1100, null),
("AAA", 111, 1200, "event_b"),
("AAA", 111, 1300, null),
("AAA", 222, 1200, "event_a"),
("AAA", 222, 1300, "event_b"),
("AAA", 222, 1400, null),
("AAA", 222, 1500, null)
).toDF("key1", "key2", "timestamp", "status")
val bDF = testDF.filter("status = 'event_b'")
.withColumnRenamed("timestamp", "bTimestamp")
.drop("status")
val joinedF = testDF.join(bDF, Seq("key1", "key2"))
.withColumn("dropCol", col("bTimestamp") >= col("timestamp"))
.filter("dropCol")
.drop("bTimestamp")
.drop("dropCol")
推荐阅读
- java - 我无法使用 Java Spring Boot 和 Angular 7 在远程服务器 (Apache2) 上上传文件。它在 localhost 上运行良好
- python-3.x - 构造函数中的默认参数神奇地变成了类变量
- sql-server - 如何区分创建的文件表中的键
- c++ - 在链接时插入字符串
- vue.js - 如何在 vuex 存储中使用 JSON 数据(无 webpack)
- three.js - 如何仅突出显示整个对象的一个特定部分并使其可点击?
- android - 当 NavHostFragment 的容器消失后,back-stack 为空
- ionic-framework - 错误:找不到模块“@ionic/angular”
- python-3.x - 我是一个初学者,我想在我的计算器程序中添加一个循环,这样我就不需要一次又一次地运行它。我能做些什么?
- javascript - Forge Viewer:同时显示底部工具栏和标记