在PySpark中实现列的两两组合:代码与预期结果验证
问题分析与修正
你的代码无法得到预期结果,核心问题出在对PySpark RDD map 操作的逻辑理解偏差上:
- 当你执行
numeric_cols_sc = sc.parallelize(numeric_cols)时,生成的RDD里每个元素是单独的列名字符串(比如'clump_thickness'、'a'、'b')。 - 调用
map(combinations2)时,combinations2会被逐个作用在每个单独的列名字符串上。而combinations('clump_thickness', 2)会把字符串拆成单个字符的两两组合(比如('c','l')、('c','u')这类结果),这完全不是你想要的列名两两组合。 - 后续的
flatMap只是把这些字符组合展开,最终结果和预期完全不符。
正确的实现方式
你不需要把列名列表并行化后再做map操作,直接在驱动端对原始列表调用 combinations 即可,之后如果需要转为RDD再并行化:
from itertools import combinations numeric_cols = ['clump_thickness', 'a', 'b'] # 先在驱动端生成预期的两两组合 col_combinations = list(combinations(numeric_cols, 2)) # 如果需要转为RDD供后续Spark操作使用 numeric_cols_sc = sc.parallelize(col_combinations) # 验证结果 print(numeric_cols_sc.collect()) # 输出: [('clump_thickness', 'a'), ('clump_thickness', 'b'), ('a', 'b')]
如果一定要用RDD操作(比如处理超大规模列表的场景,不过当前案例不需要),你需要把整个列表作为单个元素放入RDD中,再进行处理:
from itertools import combinations from pyspark import SparkContext sc = SparkContext("local", "CombinationExample") numeric_cols = ['clump_thickness', 'a', 'b'] # 把整个列名列表作为一个元素放入RDD single_element_rdd = sc.parallelize([numeric_cols]) # 对这个单个元素调用combinations并展开结果 result_rdd = single_element_rdd.flatMap(lambda x: combinations(x, 2)) print(result_rdd.collect()) # 输出: [('clump_thickness', 'a'), ('clump_thickness', 'b'), ('a', 'b')]
这样就能精准得到你预期的3个列名两两组合了。
内容的提问来源于stack exchange,提问作者Clock Slave
相关产品推荐
相关产品推荐

