两个 RDD 的笛卡尔积和笛卡尔的总和导致 Spark(scala)?
Cartesian product of two RDD's and Sum of the cartesion result in Spark(scala)?
我有两个 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))
您只需映射笛卡尔,收集键并计算两个数组的内积:
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))
我有两个 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))
您只需映射笛卡尔,收集键并计算两个数组的内积:
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))