我正在寻找在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安装上运行它。如果相关,详情可用。
答案 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()