Spark按值连接

时间:2015-01-03 17:53:14

标签: apache-spark

我有一对像火花这样的两对RDD

rdd1 = (1 -> [4,5,6,7])
   (2 -> [4,5])
   (3 -> [6,7])


rdd2 = (4 -> [1001,1000,1002,1003])
   (5 -> [1004,1001,1006,1007])
   (6 -> [1007,1009,1005,1008])
   (7 -> [1011,1012,1013,1010])

我想将它们组合起来看起来像这样。

joinedRdd = (1 -> [1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013])
        (2 -> [1000,1001,1002,1003,1004,1006,1007])
        (3 -> [1005,1007,1008,1009,1010,1011,1012,1013])

有人可以建议我怎么做。

由于 迪利普

1 个答案:

答案 0 :(得分:0)

使用Scala Spark API,这将是

import org.apache.spark.SparkContext._ // enable PairRDDFunctions 
val rdd1Flat = rdd1.flatMapValues(identity).map(_.swap)
val rdd2Flat = rdd2.flatMapValues(identity)

rdd1Flat.join(rdd2Flat).values.distinct.groupByKey.collect

此操作的结果是

Array[(Int, Iterable[Int])] = Array(
  (1,CompactBuffer(1001, 1011, 1006, 1002, 1003, 1013, 1005, 1007, 1009, 1000, 1012, 1008, 1010, 1004)), 
  (2,CompactBuffer(1003, 1004, 1007, 1000, 1002, 1001, 1006)), 
  (3,CompactBuffer(1008, 1009, 1007, 1011, 1005, 1010, 1013, 1012)))

Gabor提出的方法不起作用,因为Spark doesn't support RDD操作在其他RDD操作中执行。在尝试访问驱动程序上可用的SparkContext时,您将获得工作者抛出的Java NPE。