博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spark SQL 测试JoinType中所有join的类型,便于理解
阅读量:6830 次
发布时间:2019-06-26

本文共 6047 字,大约阅读时间需要 20 分钟。

准备 测试数据

trade

订单号 卖家 买家 买家城市

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

order

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

1   小王  电视  12  2015-08-01 09:08:311   小王  冰箱  24  2015-08-01 09:08:142   小李  空调  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没有的部分

转载于:https://blog.51cto.com/14309075/2400132

你可能感兴趣的文章
使用 Jasmine 进行测试驱动的 JavaScript 开发
查看>>
[CareerCup] 8.2 Call Center 电话中心
查看>>
GestureDetector和SimpleOnGestureListener的使用教程
查看>>
【FFmpeg】Windows下FFmpeg编译
查看>>
sqlserver字段类型详解
查看>>
Java多线程16:线程组
查看>>
ubuntu wireshark找不到网卡及开启IP转发
查看>>
波音公司开发最轻金属 99.99%是空气
查看>>
Python执行效率测试模块timei的使用方法与与常用Python用法的效率比较
查看>>
TextureView+SurfaceTexture+OpenGL ES来播放视频(二)
查看>>
adadmin: error while loading shared libraries: libclntsh.so.10.1
查看>>
模式匹配KMP算法
查看>>
《Android开发艺术探索》读书笔记 (2) 第2章 IPC机制
查看>>
学习 easyui 之一:easyloader 分析与使用
查看>>
大页内存(HugePages)
查看>>
extern c
查看>>
【Xamarin挖墙脚系列:配置Mac之间的连接问题】
查看>>
Intel大坑之中的一个:丢失的SSE2 128bit/64bit 位移指令,马航MH370??
查看>>
设置控件全局显示样式 appearance
查看>>
awstats 日志分析工具linux下的安装和使用
查看>>