Spark嵌套循环和RDD转换

时间:2015-09-12 06:43:35

标签: pyspark

我正在寻找在spark中实现嵌套循环的示例代码。我正在寻找以下功能。

鉴于RDD data1 = sc.parallelize(range(10))和另一个数据集data2 = sc.parallelize(['a', 'b', 'c']),我正在寻找从data2中挑选每个“关键字”的内容,并附加data1中的每个'值'创建一个键值对列表,它们可能在内部存储器中看起来像[(a,1), (a, 2), (a, 3), ..., (c, 8), (c, 9)],然后使用简单的reducer函数按键进行reduce,比如lambda x, y: x+y

根据上述逻辑,预期输出为

(a, 45)
(b, 45)
(c, 45)

我的尝试

data1 = sc.parallelize(range(100))
data2 = sc.parallelize(['a', 'b', 'c'])
f = lambda x: data2.map(lambda y: (y, x))
data1.map(f).reduceByKey(lambda x, y: x+y)

获得的错误

Exception: It appears that you are attempting to broadcast an RDD or
reference an RDD from an action or transformation. RDD transformations 
and actions can only be invoked by the driver, not inside of other 
transformations; for example, rdd1.map(lambda x: rdd2.values.count() * x) 
is invalid because the values transformation and count action cannot be 
performed inside of the rdd1.map transformation. For more information, 
see SPARK-5063.

我是一个完整的新手,所以任何帮助都非常感谢!

操作系统信息

我在linux上的独立spark安装上运行它。如果相关,详情可用。

1 个答案:

答案 0 :(得分:0)

这是一个潜在的解决方案。不过,我对此并不满意,因为它并不代表真正的for循环。

    arrOutputArray(3) = New Double() {22, 33, 44}
    or
    arrOutputData = New Double() {22, 33, 44}
    arrOutputArray(3) = arrOutputData

给出

data1 = sc.parallelize(range(10))
data2 = sc.parallelize(['a', 'b', 'c'])
data2.cartesian(data1).reduceByKey(lambda x, y: x+y).collect()