簡體   English   中英

如何壓縮兩個RDD(Scala)

[英]How to zip two RDDs (Scala)

我有兩個具有以下形式的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,類)

[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做到這一點?

PS我是Scala的菜鳥。 我正在使用Databricks。

您可以考慮使用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 doc re:RDD zip方法所說的內容:

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

將另一個RDD壓縮,並返回鍵值對以及每個RDD中的第一個元素,每個RDD中的第二個元素等。假定兩個RDD具有相同數量的分區相同數量的元素 (例如,一個是通過另一張地圖制作的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM