python - 如何根据时间戳范围和行类型配对 SPARK 数据帧中的行
问题描述
我有一个类似于这样的数据框:
+------------------+---------+------------+
| Timestamp | RowType | Value |
+------------------+---------+------------+
| 2020. 6. 5. 8:12 | X | Null |
| 2020. 6. 5. 8:13 | Y | Null |
| 2020. 6. 5. 8:14 | Y | Null |
| 2020. 6. 5. 8:15 | A | SomeValue |
| 2020. 6. 5. 8:16 | Y | Null |
| 2020. 6. 5. 8:17 | Y | Null |
| 2020. 6. 5. 8:18 | X | Null |
| 2020. 6. 5. 8:19 | Y | Null |
| 2020. 6. 5. 8:20 | Y | Null |
| 2020. 6. 6. 8:21 | A | SomeValue2 |
| 2020. 6. 7. 8:22 | Y | Null |
| 2020. 6. 8. 8:23 | Y | Null |
| 2020. 6. 9. 8:24 | X | Null |
+------------------+---------+------------+
对于每个 X 类型的行,我想从以下 A 类型的行中选择值。如果两个 X 类型之间没有 A 类型行,则 X 行的值应保持为空。
+------------------+---------+------------+
| Timestamp | RowType | Value |
+------------------+---------+------------+
| 2020. 6. 5. 8:12 | X | SomeValue |
| 2020. 6. 5. 8:18 | X | SomeValue2 |
| 2020. 6. 9. 8:24 | X | Null |
+------------------+---------+------------+
这可以使用窗口函数吗?
解决方案
如果RowType
只包含这些值 (X,Y,A) 它应该可以工作:
df.filter('RowType=!="Y")
.select('Timestamp,'RowType,lag('Value,-1).over(Window.orderBy('Timestamp)).as("lag"))
.filter('RowType==="X")
.show()
输出:
+----------------+-------+-----------+
| Timestamp|RowType| lag|
+----------------+-------+-----------+
|2020. 6. 5. 8:12| X|SomeValue |
|2020. 6. 5. 8:18| X|SomeValue2 |
|2020. 6. 9. 8:24| X| null|
+----------------+-------+-----------+
推荐阅读
- tomcat - 在类路径上未检测到 Spring WebApplicationInitializer 类型 - GEONETWORK 3.6 - CENTOS7
- python - 有没有办法使用python查看文件所在的目录?
- dart - 如何在颤动中显示自定义吐司对话框?
- php - 在 laravel 中更改列类型的最佳方法是什么?
- postgresql - Postgresql函数内部的多表修改(该函数中使用了同一个表)
- c# - 如何在MongoDB中进行自然查询和排序?
- installation - TYPO3 复制/现有安装
- reactjs - 当用户在具有不同查询参数的相同基本 url 上时,BrowserHistory 不起作用
- json - plsql 代码在不使用第三方库的情况下解析 JSON
- javascript - 从对象数组中获取 id