我想知道如何在Spark(Pyspark)中实现以下功能
初始数据帧:
+--+---+
|id|num|
+--+---+
|4 |9.0|
+--+---+
|3 |7.0|
+--+---+
|2 |3.0|
+--+---+
|1 |5.0|
+--+---+
结果数据帧:
+--+---+-------+
|id|num|new_Col|
+--+---+-------+
|4 |9.0| 7.0 |
+--+---+-------+
|3 |7.0| 3.0 |
+--+---+-------+
|2 |3.0| 5.0 |
+--+---+-------+
我通过使用类似的东西来管理通常"append"新列到数据框: df.withColumn("new_Col", df.num * 10)
但是我不知道如何为新列实现这种“行的移位”,以便新列具有前一行的字段值(如示例所示) . 我还在API文档中找不到有关如何通过索引访问DF中某一行的任何内容 .
任何帮助,将不胜感激 .
2 回答
您可以使用
lag
窗口功能,如下所示但是有一些重要的问题:
如果您需要全局操作(未被其他一些列/列分区),则效率极低 .
您需要一种自然的方式来订购数据 .
虽然第二个问题几乎从来都不是问题,但第一个问题可能是一个交易破坏者 . 如果是这种情况,您只需将
DataFrame
转换为RDD并手动计算lag
. 参见例如:How to transform data with sliding window over time series data in Pyspark
Apache Spark Moving Average(用Scala编写,但可以针对PySpark进行调整 . 请务必先阅读注释) .
其他有用的链接:
https://github.com/UrbanInstitute/pyspark-tutorials/blob/master/05_moving-average-imputation.ipynb
Spark Window Functions - rangeBetween dates