我正在执行连接,并且我的数据超过100个节点。所以我有一个小的键/值列表,我正在加入另一个键/值对。
我的列表如下:
[[1, 0], [2, 0], [3, 0], [4, 0], [5, 0], [6, 0], [7, 0], [8, 0], [9, 0], [10, 0], [11, 0], [16, 0], [18, 0], [19, 0], [20, 0], [21, 0], [22, 0], [23, 0], [24, 0], [25, 0], [26, 0], [27, 0], [28, 0], [29, 0], [36, 0], [37, 0], [38, 0], [39, 0], [40, 0], [41, 0], [42, 0], [44, 0], [46, 0]]
我有广播变量:
numB = sc.broadcast(numValuesKV)
当我加入时:
numRDD = columnRDD.join(numB.value)
我收到以下错误:
AttributeError: 'list' object has no attribute 'map'
答案 0 :(得分:2)
你正在播放一个列表,这绝对没问题。
你需要做的是
b=sc.broadcast(lst)
rdd.map(lambda t: t if t[0] in b.value)
这里t [0]应该看起来像[1,0]等。但我希望你有这个想法......
答案 1 :(得分:1)
你可以尝试将numValuesKV作为字典并查看它是否有效。
答案 2 :(得分:1)
rdd.join(other)
是加入两个RDD的意思,因此它希望other
是一个RDD。要使用高效的“小桌面广播”连接技巧,您需要“手动”进行连接。在Scala中,它看起来像这样:
rdd.mapPartitions{iter =>
val valueMap = numB.value.toMap
iter.map{case (k,v) => (k,(v,map(v))}
}
这将使用广播值以分布式方式将连接应用于RDD的每个分区。
PySpark代码应该非常相似。