如何压缩两个RDD(Scala)

时间:2019-07-16 16:50:47

标签: scala apache-spark zip rdd databricks

我有两个具有以下形式的RDD:

RDD A:(列:icchID,X_Coord)

[ICCH 1,10.0]
[ICCH 2,10.0]
[ICCH 4,100.0]
[ICCH 4,100.0]
[ICCH 2,13.0]

RDD B:(列:Y_Coord,Class)

[10.0,A]
[64.0,B]
[39.0,A]
[9.0,C]
[80.0,D]

我想将这两个RDD组合在一起,以便获得具有以下形式的RDD:

[ICCH 1,10.0,10.0,A]
[ICCH 2,10.0,64.0,B]
[ICCH 4,100.0,39.0,A]
[ICCH 4,100.0,9.0,C]
[ICCH 2,13.0,80.0,D]

请注意,两个RDD具有相同的行和列。可以使用Scala做到这一点吗?

P.S。我是Scala的菜鸟。我正在使用Databricks。

1 个答案:

答案 0 :(得分:2)

您可以考虑使用RDD zip方法以及通过map进行的转换:

val rddA = sc.parallelize(Seq(
  ("ICCH 1", 10.0), ("ICCH 2", 10.0), ("ICCH 4", 100.0), ("ICCH 5", 100.0), ("ICCH 2", 13.0)
))

val rddB = sc.parallelize(Seq(
  (10.0, "A"), (64.0, "B"), (39.0, "A"), (9.0, "C"), (80.0, "D")
))

val zippedRDD = (rddA zip rddB).map{ case ((id, x), (y, c)) => (id, x, y, c) }
// zippedRDD: org.apache.spark.rdd.RDD[(String, Double, Double, String)] = ...

zippedRDD.collect
// Array[(String, Double, Double, String)] = Array(
//   (ICCH 1,10.0,10.0,A), (ICCH 2,10.0,64.0,B), (ICCH 4,100.0,39.0,A), (ICCH 5,100.0,9.0,C), (ICCH 2,13.0,80.0,D)
// )

尽管要保持两个RDD之间的顺序是一件棘手的事情,但请注意。这是有关订购问题的SO link

以下是Spark API文档的内容:RDD zip方法说:

def zip[U](other: RDD[U])(implicit arg0: ClassTag[U]): RDD[(T, U)]
  

将此RDD替换为另一个,将键值对与   每个RDD中的第一个元素,每个RDD中的第二个元素,等等。   两个RDD具有相同的分区数量相同   每个分区中的元素数量(例如,通过地图制作的一个元素   另一方面)。