Spark Java中如何基于现有RDD生成不含相同元素自组合的新RDD
Spark Java 无自组合元素RDD实现方案
核心实现逻辑
基于RDD笛卡尔积生成全组合后,过滤掉相同元素的自组合即可完成需求,以下是可直接运行的实现代码:
长度为2的组合实现(最常用场景)
- 第一步:初始化原始RDD
// 初始化Spark上下文,此处省略SparkConf配置步骤 JavaSparkContext sc = new JavaSparkContext(conf); JavaRDD<String> rdd1 = sc.parallelize(Arrays.asList("p", "k", "t"));
- 第二步:生成全量笛卡尔积组合
JavaPairRDD<String, String> allCartesian = rdd1.cartesian(rdd1);
- 第三步:过滤自组合得到结果RDD
// 排除两个元素完全相同的自组合 JavaPairRDD<String, String> rdd2 = allCartesian.filter(tuple -> !tuple._1.equals(tuple._2));
执行后rdd2的输出结果为:(p,k)、(p,t)、(k,p)、(k,t)、(t,p)、(t,k),完全符合需求。
扩展到任意指定长度的组合
如果需要生成N(N>2)个元素的无自组合,可通过迭代笛卡尔积+逐次过滤的方式实现:
- 先生成长度为2的无自组合RDD作为初始结果
- 每次迭代将当前结果RDD与原始RDD做笛卡尔积
- 过滤新拼接的元素与已有元组中所有元素都不重复的条目
- 重复迭代直到达到指定长度即可
可选优化
如果不需要区分元素顺序(即认为(p,k)和(k,p)属于同一个组合),可调整过滤规则:
JavaPairRDD<String, String> unorderedRdd2 = allCartesian.filter(tuple -> !tuple._1.equals(tuple._2) && tuple._1.compareTo(tuple._2) < 0 );
得到的结果为:(p,k)、(p,t)、(k,t)
内容的提问来源于stack exchange,提问作者Disha Solanki
相关产品推荐
相关产品推荐

