【问题标题】:How to pair rows in SPARK dataframe based on timestamp range and row type如何根据时间戳范围和行类型配对 SPARK 数据帧中的行
【发布时间】:2020-06-05 07:32:48
【问题描述】:

我有一个类似这样的数据框:

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

这可以使用窗口函数吗?

【问题讨论】:

    标签: python scala apache-spark range window


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多