如何在PySpark collect_list中维护排序顺序并收集多个列表

时间:2018-11-08 00:38:53

标签: pyspark pyspark-sql

我想通过对多个列使用collect_list来维护日期排序顺序,所有列都具有相同的日期顺序。我将在同一数据帧中使用它们,因此可以利用它来创建时间序列模型输入。以下是“ train_data”的示例:

enter image description here

我正在使用一个带有PartitionBy的窗口,以通过Tuning_evnt_start_dt为每个Syscode_Stn确保排序顺序。我可以使用以下代码创建一列:

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

w = Window.partitionBy('Syscode_Stn').orderBy('tuning_evnt_start_dt')

sorted_list_df = train_data
.withColumn('spp_imp_daily', F.collect_list('spp_imp_daily').over(w)
           )\
.groupBy('Syscode_Stn')\
.agg(F.max('spp_imp_daily').alias('spp_imp_daily'))

但是如何在同一新数据框中创建两列?

w = Window.partitionBy('Syscode_Stn').orderBy('tuning_evnt_start_dt')

sorted_list_df = train_data
.withColumn('spp_imp_daily',F.collect_list('spp_imp_daily').over(w))
.withColumn('MarchMadInd', F.collect_list('MarchMadInd').over(w))
.groupBy('Syscode_Stn')
.agg(F.max('spp_imp_daily').alias('spp_imp_daily')))

enter image description here

请注意,MarchMadInd未显示在屏幕截图中,但包含在train_data中。我如何到达自己的位置的说明:https://stackoverflow.com/a/49255498/8691976

1 个答案:

答案 0 :(得分:1)

是的,正确的方法是添加连续的.withColumn语句,然后添加.agg语句,以删除每个数组的重复项。

w = Window.partitionBy('Syscode_Stn').orderBy('tuning_evnt_start_dt')

sorted_list_df = train_data.withColumn('spp_imp_daily', 
F.collect_list('spp_imp_daily').over(w)
                                  )\
.withColumn('MarchMadInd', F.collect_list('MarchMadInd').over(w))\

.groupBy('Syscode_Stn')\
.agg(F.max('spp_imp_daily').alias('spp_imp_daily'), 
 F.max('MarchMadInd').alias('MarchMadInd')
)