PySpark 使用 collect_list 收集变长数组
PySpark Using collect_list to collect Arrays of Varying Length
我正在尝试使用 collect_list 从两个不同的数据帧中收集数组(并保持顺序)。
Test_Data 和 Train_Data 具有相同的格式。
from pyspark.sql import functions as F
from pyspark.sql import Window
w = Window.partitionBy('Group').orderBy('date')
# Train_Data has 4 data points
# Test_Data has 7 data points
# desired target array: [1, 1, 2, 3]
# desired MarchMadInd array: [0, 0, 0, 1, 0, 0, 1]
sorted_list_diff_array_lens = train_data.withColumn('target',
F.collect_list('target').over(w)
)\
test_data.withColumn('MarchMadInd', F.collect_list('MarchMadInd').over(w))\
.groupBy('Group')\
.agg(F.max('target').alias('target'),
F.max('MarchMadInd').alias('MarchMadInd')
)
我意识到 "test_data.withColumn" 的语法不正确,但我想 select MarchMadInd 的数组 test_date,但是target的数组来自train_data。所需的输出如下所示:
{"target":[1, 1, 2, 3], "MarchMadInd":[0, 0, 0, 1, 0, 0, 1]}
上下文:这是一个 DeepAR 时间序列模型(使用 AWS),需要动态特征包括预测周期,但目标应该是历史数据。
解决方案涉及使用 pault 推荐的联接。
- 创建一个具有长度等于训练 + 预测周期的动态特征的数据帧
- 创建一个目标值长度等于训练周期的数据框。
- 使用 LEFT JOIN(在 LEFT 上使用动态特征数据)将这些数据帧放在一起
现在,使用 collect_list 将创建所需的结果。
我正在尝试使用 collect_list 从两个不同的数据帧中收集数组(并保持顺序)。
Test_Data 和 Train_Data 具有相同的格式。
from pyspark.sql import functions as F
from pyspark.sql import Window
w = Window.partitionBy('Group').orderBy('date')
# Train_Data has 4 data points
# Test_Data has 7 data points
# desired target array: [1, 1, 2, 3]
# desired MarchMadInd array: [0, 0, 0, 1, 0, 0, 1]
sorted_list_diff_array_lens = train_data.withColumn('target',
F.collect_list('target').over(w)
)\
test_data.withColumn('MarchMadInd', F.collect_list('MarchMadInd').over(w))\
.groupBy('Group')\
.agg(F.max('target').alias('target'),
F.max('MarchMadInd').alias('MarchMadInd')
)
我意识到 "test_data.withColumn" 的语法不正确,但我想 select MarchMadInd 的数组 test_date,但是target的数组来自train_data。所需的输出如下所示:
{"target":[1, 1, 2, 3], "MarchMadInd":[0, 0, 0, 1, 0, 0, 1]}
上下文:这是一个 DeepAR 时间序列模型(使用 AWS),需要动态特征包括预测周期,但目标应该是历史数据。
解决方案涉及使用 pault 推荐的联接。
- 创建一个具有长度等于训练 + 预测周期的动态特征的数据帧
- 创建一个目标值长度等于训练周期的数据框。
- 使用 LEFT JOIN(在 LEFT 上使用动态特征数据)将这些数据帧放在一起
现在,使用 collect_list 将创建所需的结果。