pysparkic对spark df上的循环执行的方式是什么

pysparkic对spark df上的循环执行的方式是什么,pyspark,Pyspark,在pyspark中,当groupby不适用时,对id执行操作的最佳方法是什么。下面是一个示例代码: for id in [int(i.id) for i in df.select('id').distinct().collect()]: temp = df.where("id == {}".format(id)) temp = temp.sort("date") my_window = Window.partitionBy().orderBy("id") temp

在pyspark中,当groupby不适用时,对id执行操作的最佳方法是什么。下面是一个示例代码:

for id in [int(i.id) for i in df.select('id').distinct().collect()]:
    temp = df.where("id == {}".format(id))
    temp = temp.sort("date")
    my_window = Window.partitionBy().orderBy("id")
    temp = temp.withColumn("prev_transaction",lag(temp['date']).over(my_window))
    temp = temp.withColumn("diff", temp['date']-temp["prev_transaction"))
    temp = temp.where('day_diff > 0')
    #select a row and so on

优化此操作的最佳方法是什么?

我想您有一个事务数据框,希望将“以前的事务”列添加到其中

from pyspark.sql.window import Window
from pyspark.sql import functions as F

windowSpec = Window.partitionBy('id').orderBy('date')
df.withColumn('pre_transactions', F.collect_list('id') \
                    .over(windowSpec.rangeBetween(Window.unboundedPreceding, 0)))
上面的代码将使用以前的事务添加数组列,直到完成此事务。但最后的事务也将添加到数组中。您可以通过简单的自定义自定义自定义项删除上一个事务,如:

remove_element = lambda l:  l[:-1]
remove_udf = udf(remove_element, ArrayType(StringType()))