spark3.0教程:RDD转换算子zip拉链

说明

将两个 RDD 中的元素,以 key-value 对的形式进行合并。

  • Key 为第 1 个 RDD中的元素
  • Value 为第 2 个 RDD 中的相同位置的元素

注意:

  • 2个RDD的 泛型可以 不一致
  • 2个RDD的 分区数 必须一致
  • 2个RDD的数据 数量 必须一致

声明

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

注意: 形参RDD泛型是U,可以与源RDD泛型不一致

例子

val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)

//2个rdd分区数是相同的
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5))
val rdd2:RDD[Int] = sc.makeRDD(List(4,5,6,7,8))

val resRDD=rdd.zip(rdd2)

resRDD.collect().foreach(println)
sc.stop()

执行结果:

(1,4)
(2,5)
(3,6)
(4,7)
(5,8)

例子:泛型不同

val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)

//2个rdd分区数是相同的
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4))
val rdd2:RDD[String] = sc.makeRDD(List("李雷","韩梅梅","lili","lucy"))

val resRDD=rdd.zip(rdd2)

resRDD.collect().foreach(println)
sc.stop()

执行结果:

(1,李雷)
(2,韩梅梅)
(3,lili)
(4,lucy)

例子:分区数不一致

val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)

//2个rdd分区数是相同的
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4),2)
val rdd2:RDD[String] = sc.makeRDD(List("李雷","韩梅梅","lili","lucy"),3)

val resRDD=rdd.zip(rdd2)

resRDD.collect().foreach(println)
sc.stop()

执行报错如下:

java.lang.IllegalArgumentException: Can't zip RDDs with unequal numbers of partitions: List(2, 3)

例子:数量不一致

val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
val sc = new SparkContext(sparConf)

//2个rdd分区数是相同的
val rdd:RDD[Int] = sc.makeRDD(List(1,2,3,4,5))
val rdd2:RDD[String] = sc.makeRDD(List("李雷","韩梅梅","lili","lucy"))

val resRDD=rdd.zip(rdd2)

resRDD.collect().foreach(println)
sc.stop()

执行报错如下:

org.apache.spark.SparkException: Can only zip RDDs with same number of elements in each partition

原文出处:/show_1IX1KfSDHKvu.html