Spark SQL 测试JoinType中所有join的类型,便于理解
发表于:2025-12-03 作者:千家信息网编辑
千家信息网最后更新 2025年12月03日,准备 测试数据trade订单号 卖家 买家 买家城市1 A 小王 北京2 B 小李 天津3 A 小刘 北京order所属订单号 买家 商品名称 价格 发货时间1 小王
千家信息网最后更新 2025年12月03日Spark SQL 测试JoinType中所有join的类型,便于理解
准备 测试数据
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没有的部分
小王
北京
小李
天津
冰箱
电视
空调
小刘
买家
类型
交集
等价
订单
订单号
部分
测试
价格
卖家
名称
商品
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
全军出击的服务器怎么下载
榆林软件开发企业
重庆计算机网络技术专科院校
爱奇艺app 服务器地址
计算机软件开发地域分析
奥的斯服务器英文转中文
软件开发公司宣传栏
网络安全事件进行分级
金华创新互联网科技有限公司
项立刚谈未来网络技术研究
模块化数据库管理软件
济南星飞网络技术有限公司
校园网络安全问题作文
在哪里学软件开发好
国内互联网科技发展怎么样
2021国家网络安全宣传
供电网络安全周
服务器健康监控管理系统
电话显示服务器不可使用
omim数据库表型列表
新基建服务器特质
前端页面实现对数据库的增删改查
常熟创新软件开发专业服务
网易mc服务器怎么自定义
互联网展开科技教育
有线网络技术有哪几种
软件开发招聘大专的大丰
供电网络安全周
泸州警校网络安全与执法专业
数据库一个字段有多个值