Spark SQL 测试JoinType中所有join的类型,便于理解
发表于:2025-01-31 作者:千家信息网编辑
千家信息网最后更新 2025年01月31日,准备 测试数据trade订单号 卖家 买家 买家城市1 A 小王 北京2 B 小李 天津3 A 小刘 北京order所属订单号 买家 商品名称 价格 发货时间1 小王
千家信息网最后更新 2025年01月31日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安全错误
数据库的锁怎样保障安全
个人文件服务器微信小程序版
qt简单的数据库使用
安全服务工程师网络安全工程师
河北服务器电源怎么卖
官方文案数据库
金蝶服务器配置
知了互联网科技有限公司
三大数据库技术能用什么来存储
数据库导表结构工具
思科网第十二章网络安全答案
带货直播源码系统软件开发
滨州网络安全整治
xdb 文本数据库
医疗器械网络安全审查指导原则
王国纪元服务器
通辽网络技术团队
数据库设计好的优点
三级网络技术考试资料百度云
计件生产管理软件开发
服务器里的代码都是加密的吗
管理软件开发费用标准
仓库管理系统服务器端
如何预防网络安全英语作文
数据库系统基础教程试卷
红警战网服务器1和2有区别吗
九江高性价比服务器找哪家好
到学校开展网络安全宣讲
网络安全红线管理三严禁
常州app软件开发的企业
erp管理软件开发方案