如何在RDD的列表列表中利用排列实现元素配对
解决Spark RDD生成子列表元素配对的问题
需求说明
从RDD的每个子列表中生成所有可能的元素配对,输入RDD示例:
[['a','b','c'],['e','f','g','h'],['x','y','z']]
期望输出所有元素两两配对的二元组(包含正向和反向配对,如('a','b')和('b','a'))。
实现方案
方法1:生成有序两两配对(含反向)
使用Python的itertools.permutations生成子列表中所有长度为2的有序排列,再通过Spark的flatMap展平结果:
import itertools from pyspark import SparkContext sc = SparkContext("local", "ElementPairs") # 初始化输入RDD input_rdd = sc.parallelize([['a','b','c'],['e','f','g','h'],['x','y','z']]) # 生成所有有序配对 result_rdd = input_rdd.flatMap(lambda sub_list: itertools.permutations(sub_list, 2)) # 查看结果 print(result_rdd.collect())
执行后输出示例:
[('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('e', 'f'), ('e', 'g'), ('e', 'h'), ('f', 'e'), ('f', 'g'), ('f', 'h'), ('g', 'e'), ('g', 'f'), ('g', 'h'), ('h', 'e'), ('h', 'f'), ('h', 'g'), ('x', 'y'), ('x', 'z'), ('y', 'x'), ('y', 'z'), ('z', 'x'), ('z', 'y')]
方法2:生成无序两两配对(仅保留一组)
如果不需要反向配对,可使用itertools.combinations生成无序组合:
import itertools from pyspark import SparkContext sc = SparkContext("local", "ElementPairs") input_rdd = sc.parallelize([['a','b','c'],['e','f','g','h'],['x','y','z']]) result_rdd = input_rdd.flatMap(lambda sub_list: itertools.combinations(sub_list, 2)) print(result_rdd.collect())
输出示例:
[('a', 'b'), ('a', 'c'), ('b', 'c'), ('e', 'f'), ('e', 'g'), ('e', 'h'), ('f', 'g'), ('f', 'h'), ('g', 'h'), ('x', 'y'), ('x', 'z'), ('y', 'z')]
关键说明
flatMap:将每个子列表生成的配对列表展平,把所有二元组合并到同一个RDD中。itertools.permutations(sub_list, 2):生成子列表中所有两个不同元素的有序排列,包含(a,b)和(b,a)。itertools.combinations(sub_list, 2):生成子列表中所有两个不同元素的无序组合,仅保留一组方向的配对。
内容的提问来源于stack exchange,提问作者nYuker_98 D
相关产品推荐
相关产品推荐

