我有两个具有以下形式的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。
答案 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具有相同的分区数量和相同 每个分区中的元素数量(例如,通过地图制作的一个元素 另一方面)。