Spark SQL 测试JoinType中所有join的类型,便于理解

匿名 (未验证) 提交于 2019-12-02 23:35:02

准备 测试数据

trade
订单号 卖家 买家 买家城市

1   A   小王  北京 2   B   小李  天津 3   A   小刘  北京

order
所属订单号 买家 商品名称 价格 发货时间

1   小王  电视  12  2015-08-01 09:08:31 1   小王  冰箱  24  2015-08-01 09:08:14 2   小李  空调  12  2015-09-02 09:01:31

注:皆以\t分割

创建DF

 def main(args: Array[String]): Unit = { val spark=SparkSession.builder()       .appName("JoinDemo")       .master("local[2]")       .getOrCreate()  import spark.implicits._  val order=spark.sparkContext.textFile("order.data").map(_.split("\t")).map(x=>Order(x(0),x(1),x(2),x(3),x(4))).toDF()  val trade=spark.sparkContext.textFile("trade.data").map(_.split("\t")).map(x=>Trade(x(0),x(1),x(2),x(3))).toDF()     order.show() //    +----+-----+------+-----+----------+ //    |o_id|buyer|p_name|price|      date| //    +----+-----+------+-----+----------+ //    |   1| 小王|  电视|   12|2015-08-01| //      |   1| 小王|  冰箱|   24|2015-08-01| //      |   2| 小李|  空调|   12|2015-09-02| //      +----+-----+------+-----+----------+      trade.show() //    +----+------+-----+----------+ //    |o_id|seller|buyer|buyer_city| //    +----+------+-----+----------+ //    |   1|     A| 小王|      北京| //      |   2|     B| 小李|      天津| //      |   3|     A| 小刘|      北京| //      +----+------+-----+----------+  }   case class Student(id:String,name:String,phoneNum:String,email:String)   case class Order(o_id:String,buyer:String,p_name:String,price:String,date:String)   case class Trade(o_id:String,seller:String,buyer:String,buyer_city:String)

JoinType类型

默认是 `inner`. 必须是以下类型的一种:`inner`, `cross`, `outer`, `full`, `full_outer`, `left`, `left_outer`,`right`, `right_outer`, `left_semi`, `left_anti`.

1、不指定和 inner

不指定

 trade.join(order,trade("o_id")===order("o_id")).show
+----+------+-----+----------+----+-----+------+-----+----------+ |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+

指定inner

scala> trade.join(order,trade("o_id")===order("o_id"),"inner").show +----+------+-----+----------+----+-----+------+-----+----------+                |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+

不指定和inner都是一样,都是求两Datarame的交集。

2、left 和 left outer

scala> trade.join(order,trade("o_id")===order("o_id"),"left").show +----+------+-----+----------+----+-----+------+-----+----------+                |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   3|     A| 小刘|      北京|null| null|  null| null|      null| |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+  scala> trade.join(order,trade("o_id")===order("o_id"),"left_outer").show +----+------+-----+----------+----+-----+------+-----+----------+                |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   3|     A| 小刘|      北京|null| null|  null| null|      null| |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+

left join和left outer join完全等价

right 和 right outer

scala> trade.join(order,trade("o_id")===order("o_id"),"right_outer").show +----+------+-----+----------+----+-----+------+-----+----------+                |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+  scala> trade.join(order,trade("o_id")===order("o_id"),"right").show +----+------+-----+----------+----+-----+------+-----+----------+ |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+

right 和 right outer等价

full_outer

scala> trade.join(order,trade("o_id")===order("o_id"),"full_outer").show +----+------+-----+----------+----+-----+------+-----+----------+                |o_id|seller|buyer|buyer_city|o_id|buyer|p_name|price|      date| +----+------+-----+----------+----+-----+------+-----+----------+ |   3|     A| 小刘|      北京|null| null|  null| null|      null| |   1|     A| 小王|      北京|   1| 小王|  电视|   12|2015-08-01| |   1|     A| 小王|      北京|   1| 小王|  冰箱|   24|2015-08-01| |   2|     B| 小李|      天津|   2| 小李|  空调|   12|2015-09-02| +----+------+-----+----------+----+-----+------+-----+----------+

得出两Datarame交集

left_semi

scala> trade.join(order,trade("o_id")===order("o_id"),"left_semi").show +----+------+-----+----------+ |o_id|seller|buyer|buyer_city| +----+------+-----+----------+ |   1|     A| 小王|      北京| |   2|     B| 小李|      天津| +----+------+-----+----------+ 

过滤出两DF共有的部分

left_anti

cala> trade.join(order,trade("o_id")===order("o_id"),"left_anti").show +----+------+-----+----------+ |o_id|seller|buyer|buyer_city| +----+------+-----+----------+ |   3|     A| 小刘|      北京| +----+------+-----+----------+

过滤出DF2中DF1没有的部分

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!