Spark SQL 测试JoinType中所有join的类型,便于理解
发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,准备 测试数据trade订单号 卖家 买家 买家城市1 A 小王 北京2 B 小李 天津3 A 小刘 北京order所属订单号 买家 商品名称 价格 发货时间1 小王
千家信息网最后更新 2026年11月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安全错误
数据库的锁怎样保障安全
互联网科技保险
智能科技公司是互联网公司吗
互联网科技有限公司图片
北京互联网科技
美国互联网科技
深圳期待互联网科技
科技互联网创业计划书
上海卓越科技 互联网
湖南洣水互联网科技有限公司扣款
移动互联网科技股
互联网科技有哪些公司
洛阳昕诺飞互联网科技有限公司
互联网科技扶贫时间
中国科技创新与世界互联网大会
用友工业互联网科技发展
四川互联网展示科技馆设计
浙南科技城互联网大厦招聘
抖集互联网科技技术咨询
互联网高科技行业有哪些企业
互联网科技创新方面的资料
上海挚品互联网科技有限公司
美国互联网保险保险科技
鸠鸠互联网科技
金诺互联网科技
互联网 科技创业
盛创互联网科技有限公司
卫星互联网科技股票
湖北码尼互联网科技有限公司电话
互联网科技融合创新
亚光科技低轨卫星互联网