我如何在PySpark中进行嵌套转换

时间:2016-04-17 06:44:31

标签: python lambda nested pyspark map-function

以下是我的数据示例:

data1 = [[ 'red blue hi you red' ],
     [ 'ball green ball go four ball'],
     [ 'nice red start nice' ],
     [ 'ball no kill tree go go' ]]

从以前的数据中获取以下内容:

data2 = 
[[[ 'red', 2 ], [ 'blue', 1 ], [ 'hi', 1 ], [ 'you', 1 ]],
[[ 'green', 1 ], [ 'go', 1 ], [ 'four', 1 ], [ 'ball', 3 ]],
[[ 'red, 1 ], [ 'start', 1 ], [ 'nice', 2 ]],
[[ 'ball', 1 ], [ 'no', 1 ], [ 'kill', 1 ], [ 'tree', 1 ], [ 'go', 2 ]]]

注意:请注意,RDD data2具有嵌套列表,其中包含RDD数据中每个元素中提到的单词的次数1 我想要的是应用以下代码:

data3 = data2.map(lambda x: [data1.filter(lambda z: y[0] in z) for y in x])

输出应该是包含给定单词的data1中的列表或元素。 例如:如果单词'red'传递给循环然后过滤,它应该给我2个来自data1的列表:

[ 'red blue hi you red' ]
[ 'nice red start nice' ]

但它一直给出以下错误:

例外:您似乎正在尝试广播RDD或从动作或转换中引用RDD。 RDD转换和操作只能由驱动程序调用,而不能在其他转换内部调用;例如,rdd1.map(lambda x:rdd2.values.count()* x)无效,因为无法在rdd1.map转换内执行值转换和计数操作。有关更多信息,请参阅SPARK-5063。

我尝试用另一种方法,即定义一个函数,然后将其传递到转换映射中,如:

def func(y)
    data1.filter(lambda z: y[0] in z)
data3 = data2.map(lambda x: [ func(y) for y in x])

但它仍然是同样的错误,显然试图聪明不起作用:3 我能做什么?提前谢谢。

1 个答案:

答案 0 :(得分:1)

答案很简短而且确定无疑:你做不到。对分布式数据结构的嵌套操作不是很有可能,并且很可能在Spark中不受支持。根据上下文,您可以使用joinmap将这些内容替换为本地(可选广播)数据结构。