PySpark数据框 - 为相同值的序列提供ID

时间:2016-07-28 10:52:03

标签: python apache-spark dataframe pyspark apache-spark-sql

我在pyspark作业中有一个看起来像这样的数据集:

frame_id    direction_change  
1           False  
2           False  
3           False  
4           True  
5           False  

我想为每一行添加一个“轨道”计数器,以便方向更改之间的所有帧具有相同的值。例如,我想要的输出如下所示:

frame_id    direction_change    track
1           False               1
2           False               1
3           False               1
4           True                2
5           False               2  

我已经能够通过以下动作与Pandas一起做到这一点:

frames['track'] = frames['direction_change'].cumsum()

但是在Spark数据框架中找不到相同的方法。 任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:2)

长话短说在PySpark中没有有效的方法可以单独使用DataFrames。人们可能会想要使用这样的窗口函数:

from pyspark.sql.functions import col, sum as sum_
from pyspark.sql.window import Window

w = Window().orderBy("frame_id")

df.withColumn("change", 1 + sum_(col("direction_change").cast("long")).over(w))

但这种效率低下并且不会失败。可以使用How to compute cumulative sum using Spark中显示的较低级API,但在Python中,它需要移出Dataset / Dataframe API并使用普通RDD。