Python PySpark映射上的未知错误+;广播
我有一大组元组,其中Python PySpark映射上的未知错误+;广播,python,apache-spark,pyspark,rdd,Python,Apache Spark,Pyspark,Rdd,我有一大组元组,其中元组[0]=整数和元组[1]=整数列表(由groupBy生成)。为了简单起见,我调用值tuple[0]键 列表元组[1]中的值最终可以是其他键 如果key=n,则key的所有元素都大于n且已排序/不同 在我正在处理的问题中,我需要通过以下方式找到公共元素的数量: 0[1,2] 1、[3,4,5] 2、[3,7,8] ….. 键0的值列表: 1:[3,4,5] 2:[3,7,8] 1列表和2列表之间的公共元素:3->len(公共元素)=1 然后我对键1、2等应用相同的设置,因此
元组[0]=整数
和元组[1]=整数列表
(由groupBy
生成)。为了简单起见,我调用值tuple[0]
键
列表元组[1]
中的值最终可以是其他键
如果key=n
,则key的所有元素都大于n且已排序/不同
在我正在处理的问题中,我需要通过以下方式找到公共元素的数量:
0[1,2]
1、[3,4,5]
2、[3,7,8]
…..
键0
的值列表:
1:[3,4,5]
2:[3,7,8]
1
列表和2
列表之间的公共元素:3
->len(公共元素)=1
然后我对键1、2等应用相同的设置,因此:
1
的值列表:
3:..
4:..
5:..
我编写的顺序脚本基于pandas数据帧df
,第一列v
作为“键”列表(as index=True
),第二列n
作为值列表:
for i in df.v: #iterate each value
for j in df.n[i]: #iterate within the list
common_values = set(df.n[i]).intersection(df.n[j])
if len(common_values) > 0:
return len(common_values)
因为它是一个大数据集,所以我尝试用PySpark编写一个并行版本
df.A #column of integers
df.B #column of integers
val_colA = sc.parallelize(df.A)
val_colB = sc.parallelize(df.B)
n_values = val_colA.zip(val_colB).groupByKey().MapValues(sorted) # RDD -> n_values[0] will be the key, n_values[1] is the list of values
n_values_broadcast = sc.broadcast(n_values.collectAsMap()) #read only dictionary
def f(element):
for i in element[1]: #iterating the values of "key" element[0]
common_values = set(element[1]).intersection(n_values_broadcast.value[i])
if len(common_values) > 0:
return len(common_values)
collection = n_values.map(f).collect()
程序在几秒钟后失败,出现错误,如KeyError:665
,但未提供任何具体的失败原因
我是一个火花初学者,因此不确定这是正确的方法(我应该考虑<代码>前缀)吗?或者<代码> MavituthOuts<代码>,特别是错误在哪里。p>
谢谢你的帮助。这个错误实际上非常清楚,而且是特定于Spark的。您正在使用\uuu getitem\uuuu
([]
)访问Pythondict
:
如果字典中缺少键,您将得到KeyError
。改用get
方法:
n_values_broadcast.value.get(i, [])
n_values_broadcast.value.get(i, [])