PySpark广播变量加入

时间:2015-04-20 17:32:25

标签: python apache-spark pyspark

我正在执行连接,并且我的数据超过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'

3 个答案:

答案 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代码应该非常相似。