Pyspark 2.1.0将数组包装到数组中

时间:2017-04-06 21:49:33

标签: arrays pyspark

我有一个包含两列的Spark(Python)数据框:一个用户ID,然后是一个数组数组,它​​在Spark中表示为一个包装数组,如下所示:

[WrappedArray(9, 10, 11, 12), WrappedArray(20, 21, 22, 23, 24, 25, 26)] 

在通常的表示中,这看起来像这样:

[[9, 10, 11, 12], [20, 21, 22, 23, 24, 25, 26]]

我想对每个子阵列执行操作,例如,取第三个列表并检查它的任何值是否在第一个子阵列中,但我似乎无法找到pyspark 2.0的解决方案(仅限特定于Scala的旧解决方案,例如thisthis)。

如何访问(并且通常使用)包装数组?什么是做我上面描述的有效方法?

1 个答案:

答案 0 :(得分:1)

您可以将每个包装的数组视为单独的列表。在你的例子中,如果你想在第一个数组中出现第二个包装数组中的哪些元素,你可以做类似的事情 -

%Ming Lian%

输出:

# Prepare data 
data = [[10001,[9, 10, 11, 12],[20, 10, 9, 23, 24, 25, 26]],
        [10002,[8, 1, 2, 3],[49, 3, 6, 5, 6]],
       ]
rdd = sc.parallelize(data) 

df = rdd.map( 
        lambda row : row+[
                          [x for x in row[2] if x in row[1]]
                         ]
           ).toDF(["userID","array1","array2","commonElements"])

df.show()