这可以是通过使用如下所示的火花窗口功能来实现。
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