PySpark使用collect_list收集长度可变的数组

时间:2018-12-06 22:22:48

标签: amazon-web-services pyspark amazon-sagemaker

我正在尝试使用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”的语法不正确,但是我想从 test_date 中为 MarchMadInd 选择数组,但要为< train_data 中的em> target 。所需的输出将如下所示:

{"target":[1, 1, 2, 3], "MarchMadInd":[0, 0, 0, 1, 0, 0, 1]}

上下文:这是针对DeepAR时间序列模型(使用AWS)的,该模型要求动态功能包括预测期,但目标应为历史数据。

1 个答案:

答案 0 :(得分:0)

解决方案包括使用pault建议的联接。

  1. 创建长度等于训练+预测期的动态特征的数据框
  2. 创建一个目标长度等于训练周期的数据框。
  3. 使用左侧联接(左侧具有动态特征数据)将这些数据框组合在一起

现在,使用collect_list将创建所需的结果。