這可以是通過使用如下所示的火花窗口功能來實現。
import org.apache.spark.sql.expressions.Window
val df = Seq((1,0,2), (1,1,1), (1,2,4), (2,0,6), (2,1,2)).toDF("groupId", "time", "value")
val result = df.withColumn("value_t-1", sum($"value").over(Window.partitionBy("groupId").orderBy("time").rowsBetween(-1,-1)))
輸出:
scala> result.show()
+-------+----+-----+---------+
|groupId|time|value|value_t-1|
+-------+----+-----+---------+
| 1| 0| 2| null|
| 1| 1| 1| 2|
| 1| 2| 4| 1|
| 2| 0| 6| null|
| 2| 1| 2| 6|
+-------+----+-----+---------+
Python版本:
>>> from pyspark.sql.window import Window
>>> import pyspark.sql.functions as func
>>> df = spark.createDataFrame([(1,0,2), (1,1,1), (1,2,4), (2,0,6), (2,1,2)], ["groupId", "time", "value"])
>>> result = df.withColumn("value_t-1", func.sum(df.value).over(Window.partitionBy(df.groupId).orderBy(df.time).rowsBetween(-1,-1)))
>>> result.show()
+-------+----+-----+---------+
|groupId|time|value|value_t-1|
+-------+----+-----+---------+
| 1| 0| 2| null|
| 1| 1| 1| 2|
| 1| 2| 4| 1|
| 2| 0| 6| null|
| 2| 1| 2| 6|
+-------+----+-----+---------+
你要做到這幾個文件?如果你只需要修復一個文件,那麼做一個簡單的for循環,然後等待(可能很多)來解析你的3GB數據 – JBernardo
@JBernardo現在我只需要做一次,但是有可能會變成這樣更常用的用例。這個循環是在1到2天的球場中的某個地方 - 只是看到只有一個繁忙的核心而感到傷心...... – bam