如何将RDD中的每一行相互相乘?

时间:2017-09-08 19:05:53

标签: scala apache-spark apache-spark-sql cartesian-product

我的RDD类似于

// build.gradle project
repositories {
    maven{
        url 'https://dl.bintray.com/omaflak/maven'
    }
}

// build.gradle module
dependencies {
    compile 'me.aflak.libraries:filter-annotation:1.0'
    annotationProcessor 'me.aflak.libraries:filter-processor:1.0'
}

我需要使用

获取RDD
CELL-ID | COUNT
--------------
abcd       10
DEF        20
ghi        15

如何做到这一点?我一直使用笛卡尔积,但无法得到输出

CELL-ID-1 | CELL-ID-2 | PRODUCT
--------------
abcd       DEF            200
abcd       ghi            150
DEF        abcd           200
DEF        ghi            300
...
....

1 个答案:

答案 0 :(得分:4)

您可以让t1t2代表元组(整个“记录”):

val result = orginalRDD.cartesian(orginalRDD).collect {
  case (t1: (String ,Int), t2: (String ,Int)) if t1 != t2 => (t1._1, t2._1, t1._2 * t2._2)
}

或者,您也可以这样做但使用模式匹配来进一步分解它们:

val result = orginalRDD.cartesian(orginalRDD).collect {
  case (t1@(s1 ,i1), t2@(s2, i2)) if t1 != t2 => (s1, s2, i1 * i2)
}

您的解决方案似乎是尝试同时执行这两项操作......