我有一大组元组tuple[0] = integer
和tuple[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
),尤其是错误在哪里。
感谢您的帮助。
答案 0 :(得分:1)
错误实际上非常清楚且Spark特定。您正在使用dict
(__getitem__
)
[]
n_values_broadcast.value[i]
如果字典中缺少密钥,您将获得KeyError
。改为使用get
方法:
n_values_broadcast.value.get(i, [])