首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火花:从RDD[X]中产生所有可能组合的RDD[(X,X)]

火花:从RDD[X]中产生所有可能组合的RDD[(X,X)]
EN

Stack Overflow用户
提问于 2014-10-24 23:51:09
回答 4查看 29K关注 0票数 25

在Spark中可以从scala集合中实现'.combinations‘函数吗?

代码语言:javascript
复制
   /** Iterates over combinations.
   *
   *  @return   An Iterator which traverses the possible n-element combinations of this $coll.
   *  @example  `"abbbc".combinations(2) = Iterator(ab, ac, bb, bc)`
   */

例如,对于大小= 2的组合,如何从RDDX到RDD[ListX]或RDD(X,X),并假设RDD中的所有值都是唯一的。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-10-25 17:25:24

笛卡尔积和组合是两种不同的东西,笛卡尔积将创建一个大小为rdd.size() ^ 2的RDD,而组合将创建一个rdd.size() choose 2大小的RDD。

代码语言:javascript
复制
val rdd = sc.parallelize(1 to 5)
val combinations = rdd.cartesian(rdd).filter{ case (a,b) => a < b }`.
combinations.collect()

注意,只有在列表元素上定义了排序时,这才能工作,因为我们使用的是<。此方法只适用于选择两个,但可以通过确保序列中所有a和b的关系a < b来轻松扩展。

票数 31
EN

Stack Overflow用户

发布于 2014-10-25 08:03:37

带有cartesian转换的Spark本机支持这一点。

例如:

代码语言:javascript
复制
val rdd = sc.parallelize(1 to 5)
val cartesian = rdd.cartesian(rdd)
cartesian.collect

Array[(Int, Int)] = Array((1,1), (1,2), (1,3), (1,4), (1,5), 
(2,1), (2,2), (2,3), (2,4), (2,5), 
(3,1), (3,2), (3,3), (3,4), (3,5), 
(4,1), (4,2), (4,3), (4,4), (4,5), 
(5,1), (5,2), (5,3), (5,4), (5,5))
票数 3
EN

Stack Overflow用户

发布于 2014-10-25 20:06:17

如前所述,cartesian将为您提供RDD的笛卡儿积的n^2元素。该算法计算RDD的组合(n,2),而不必先计算n^2元素:(使用字符串作为类型,泛化到类型T需要一些带有classtag的管道,这会模糊这里的目的)

由于强制计算RDD的迭代counttake操作,这可能会降低笛卡尔+滤波的时间效率,但更节省空间,因为它只计算C(n,2) = n!/(2*(n-2))! = (n*(n-1)/2)元素而不是笛卡尔积的n^2

代码语言:javascript
复制
 import org.apache.spark.rdd._

 def combs(rdd:RDD[String]):RDD[(String,String)] = {
    val count = rdd.count
    if (rdd.count < 2) { 
        sc.makeRDD[(String,String)](Seq.empty)
    } else if (rdd.count == 2) {
        val values = rdd.collect
        sc.makeRDD[(String,String)](Seq((values(0), values(1))))
    } else {
        val elem = rdd.take(1)
        val elemRdd = sc.makeRDD(elem)
        val subtracted = rdd.subtract(elemRdd)  
        val comb = subtracted.map(e  => (elem(0),e))
        comb.union(combs(subtracted))
    } 
 }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26557873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档