spark3.0教程:RDD转换算子leftOuterJoin()

说明

相当于 SQL 中的 left join

与 join() 类似,返回的RDD是 key-value:以 左侧 RDD 的key为主 ,将相同的key的value连接在一起,组成元祖,该元祖作为value,如下图:

注意

以 左侧 RDD 的key为主

例子

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

val rdd1:RDD[(String,Int)] = sc.makeRDD(List(("李雷",182),("韩梅梅",169),("lili",170)))
val rdd2:RDD[(String,String)] = sc.makeRDD(List(("lucy","女"),("李雷","男"),("韩梅梅","女")))

val resRDD:RDD[(String, (Int, Option[String]))]=rdd1.leftOuterJoin( rdd2)

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

执行结果:

(李雷,(182,Some(男)))
(韩梅梅,(169,Some(女)))
(lili,(170,None))

案例

有时需要对数据进行翻译

读取 HDFS 文本文件,返回 RDD1,数据如下:

("李雷", 1)
("韩梅梅", 2)
("lili", 3)

解释:第二个元素表示学历,需要对该值进行翻译,而该翻译的数据在 MySQL、redis 中,需要 spark 连接该数据库,查询的结果在 RDD2中,如下:

(1, "博士")
(2, "研究生")
(3, "本科")

翻译结果如下:

("李雷", "博士")
("韩梅梅", "研究生")
("lili", "本科")

代码:

def main(args: Array[String]): Unit = {
  val sparConf = new SparkConf().setMaster("local[*]").setAppName("RDD")
  val sc = new SparkContext(sparConf)
  val hiveRDD: RDD[(String, Int)] = sc.makeRDD(List(("李雷", 1), ("韩梅梅", 2), ("lili", 3), ("lucy", 4)))
  val mysqlRDD: RDD[(Int, String)] = sc.makeRDD(List((1, "博士"), (2, "研究生"), (3, "本科")))

  val hiveRDD2 = hiveRDD.map(e => (e._2, e._1))

  /*
  (Int, (String, Option[String]))
  Int:1、2、3
   (String, Option[String]):String是 人名,学历
   */
  val resRDD:RDD[(Int, (String, Option[String]))]=hiveRDD2.leftOuterJoin( mysqlRDD)

  val resRDD2 = resRDD.map(e => (e._2._1, e._2._2.getOrElse("未知")))
  resRDD2.foreach(println)


  sc.stop()
}

原文出处:/show_1IX1No1kbphZ.html