Python PySpark广播变量联接

Python PySpark广播变量联接,python,apache-spark,pyspark,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], [

我正在执行连接,我的数据跨越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'

你能试着把numValuesKV做成一个字典,看看它是否有效。

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

您正在广播一个列表,这是绝对正确的

你需要做的是

b=sc.broadcast(lst)
rdd.map(lambda t: t if t[0] in b.value)

这里的t[0]应该类似于[1,0]等,但我希望您能理解……

谢谢,我将在python中尝试一下。所以我一直在使用join作为一个非常低效的过滤器。我所做的基本上是试图只保留该列表中的密钥。Join的很贵,但我一直在尝试如何过滤掉密钥!=该列表没有成功。如果目的是过滤,而不是
iter.map
使用
iter.filter(cond)
,那么您就完成了。+1我有同样的问题。。我试图将广播值转换为字典,结果导致TypeError:“广播”对象不可编辑