【问题标题】:Cartesian product of two RDD's and Sum of the cartesion result in Spark(scala)?两个RDD的笛卡尔积和笛卡尔的总和导致Spark(scala)?
【发布时间】:2017-11-02 13:35:55
【问题描述】:

我有两个 RDDS(Spark scala),如下所示:

rdd1 是Array((1,Array(1,2,3)),(2,Array(1,2,4)))

rdd2 是Array((1,Array(4,5,6)),(2,Array(3,5,6)))

首先我必须产生笛卡尔和上述两个 RDD 的数组值的总和。

例如笛卡尔如下:

((11,(Array(1,2,3),Array(4,5,6))),(12,(Array(1,2,3),Array(3,5,6))),(21,(Array(1,2,4),Array(4,5,6))),(22,(Array(1,2,4),Array(3,5,6))))

笛卡尔和求和如下:

Array((11,1*4+2*5+3*6) ,(12,1*3+2*5+3*6),(21,(1*4+2*5+4*6))(22,(1*3+2*5+4*6))

我尝试过如下笛卡尔坐标:

scala> val cart=rdd1.cartesian(rdd2)

但我得到的结果如下:

Array[((Int, Array[Double]), (Int, Array[Double]))] i.e. 

(((1,(Array(1,2,3))),(1,Array(4,5,6))),
  ((1,(Array(1,2,3))),(2,Array(3,5,6))),
  ((2,(Array(1,2,4))),(1,Array(4,5,6))),
  ((2,(Array(1,2,4))),(2,Array(3,5,6)))
  )

请帮我看看如何实现

Array((11,1*4+2*5+3*6) ,(12,1*3+2*5+3*6),(21,(1*4+2*5+4*6))(22,(1*3+2*5+4*6))

【问题讨论】:

    标签: arrays scala apache-spark spark-dataframe scala-collections


    【解决方案1】:

    您只需要映射 笛卡尔,收集键并计算两个数组的内积:

    rdd1.cartesian(rdd2).map{ 
        case ((k1, v1), (k2, v2)) => (k1, k2) -> v1.zip(v2).map(x => x._1 * x._2).reduce(_ + _) 
    }.collect
    
    // res5: Array[((Int, Int), Int)] = Array(((1,1),32), ((1,2),31), ((2,1),38), ((2,2),37))
    

    【讨论】:

    • 感谢您的帮助。它的工作 :) 假设我想要如下输出 ::::::: Array((11,32), (12,31), (21,38) , (22,37)) 。我怎样才能做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2012-01-03
    • 2017-03-05
    • 2017-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多