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安全错误
数据库的锁怎样保障安全
互联网科技有限公司图片
北京互联网科技公司
中国 科技 互联网
美国互联网科技
礼当家互联网科技
齐家互联网科技
远拓互联网科技
上海万想互联网科技
一五八零互联网科技
互联网科技公司名称
互联网科技公司招聘
湖南洣水互联网科技有限公司扣款
随着互联网科技发展
昭通云南众福互联网科技有限公司
湖南一路畅行互联网科技
互联网在线教育科技创业
工业互联网科技创业
东营紫格互联网科技
互联网科技企业商标注意事项
承德科技产业互联网平台
科技和互联网公司
科技制造互联网公司
深圳齐家互联网科技
一五八零互联网科技
科技与互联网哪个更好
崇明区互联网教育科技诚信经营
互联网科技商业
南博望互联网科技有限公司
互联网科技接地气
北京天晋互联网科技有限公司