PySpark地图+广播上的未知错误

时间:2017-08-11 12:24:06

标签: python apache-spark pyspark rdd

我有一大组元组tuple[0] = integertuple[1] = list of integers(由groupBy生成)。为简单起见,我将值tuple[0]调用。

列表tuple[1]内的值最终可能是其他键。

如果key = n,则键的所有元素都大于n并且已排序/不同。

在我正在处理的问题中,我需要通过以下方式找到共同元素的数量:

0, [1,2]

1, [3,4,5]

2, [3,7,8]

.....

0的值列表:

1: [3,4,5]

2: [3,7,8]

1列表与2列表之间的common_elements:3 - > len(common_elements) = 1

然后我对密钥1, 2 etc应用相同的内容,所以:

1的值列表:

3: ....

4: ....

5: ....

我编写的顺序脚本基于pandas DataFrame 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之类的错误,但没有提供任何特定的失败原因。

我是Spark初学者因此不确定这是否是正确的方法(我应该考虑foreach而不是mapPartition),尤其是错误在哪里。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

错误实际上非常清楚且Spark特定。您正在使用dict__getitem__

访问Python []
n_values_broadcast.value[i]

如果字典中缺少密钥,您将获得KeyError。改为使用get方法:

n_values_broadcast.value.get(i, [])