pysparkic对spark df上的循环执行的方式是什么
在pyspark中,当groupby不适用时,对id执行操作的最佳方法是什么。下面是一个示例代码: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
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()))