我有一个包含两列的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的旧解决方案,例如this和this)。
如何访问(并且通常使用)包装数组?什么是做我上面描述的有效方法?
答案 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()