Apache spark 基于PySpark中键、值对值的相似性减少它们

Apache spark 基于PySpark中键、值对值的相似性减少它们,apache-spark,pyspark,rdd,key-value,Apache Spark,Pyspark,Rdd,Key Value,我是Pypark的初学者 我想找出值中数字相同的字母对,然后找出哪一对字母出现得更频繁 这是我的数据 data = sc.parallelize([('a', 1), ('b', 4), ('c', 10), ('d', 4), ('e', 4), ('f', 1), ('b', 5), ('d', 5)]) data.collect() [('a', 1), ('b', 4), ('c', 10), ('d', 4), ('e', 4), ('f', 1), ('b', 5), ('d', 5

我是Pypark的初学者

我想找出值中数字相同的字母对,然后找出哪一对字母出现得更频繁

这是我的数据

data = sc.parallelize([('a', 1), ('b', 4), ('c', 10), ('d', 4), ('e', 4), ('f', 1), ('b', 5), ('d', 5)])
data.collect()
[('a', 1), ('b', 4), ('c', 10), ('d', 4), ('e', 4), ('f', 1), ('b', 5), ('d', 5)]
我想要的结果如下所示:

1: a,f
4: b, d
4: b, e
4: d, e
10: c
5: b, d
我尝试了以下方法:

data1= data.map(lambda y: (y[1], y[0]))
data1.collect()
[(1, 'a'), (4, 'b'), (10, 'c'), (4, 'd'), (4, 'e'), (1, 'f'), ('b', 5), ('d', 5)]

data1.groupByKey().mapValues(list).collect()
[(10, ['c']), (4, ['b', 'd', 'e']), (1, ['a', 'f']), (5, ['b', 'd'])]

正如我所说,我对PySpark非常陌生,并尝试在命令中搜索,但没有成功。有人能帮我吗?

您可以将
flatMap
与python
itertools.combines
结合使用,从分组值中获得2的组合。此外,更喜欢使用
reduceByKey
而不是
groupByKey

from itertools import combinations

result = data.map(lambda x: (x[1], [x[0]])) \
    .reduceByKey(lambda a, b: a + b) \
    .flatMap(lambda x: [(x[0], p) for p in combinations(x[1], 2 if (len(x[1]) > 1) else 1)])

result.collect()

#[(1, ('a', 'f')), (10, ('c',)), (4, ('b', 'd')), (4, ('b', 'e')), (4, ('d', 'e')), (5, ('b', 'd'))]
如果要在元组只有一个元素时获取“无”,可以使用以下方法:

.flatMap(lambda x: [(x[0], p) for p in combinations(x[1] if len(x[1]) > 1 else x[1] + [None], 2)])

非常感谢你!另外,如果只有一个值(10,('c',None)而不是(10,('c',)我想添加None。我将如何更改此值?我试图更改代码,但它不起作用。@user14913431您可以使用此
。平面图(lambda x:[(x[0],p)表示组合中的p(x[1]如果len(x[1])>1其他x[1]+[None],2)]
。更新了我的答案。