说明
将两个 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
