SparkSQL测试JoinType中所有join的类型,便于理解-创新互联
准备 测试数据
trade
订单号 卖家 买家 买家城市
1 A 小王 北京
2 B 小李 天津
3 A 小刘 北京
order
所属订单号 买家 商品名称 价格 发货时间
1 小王 电视 12 2015-08-01 09:08:31
1 小王 冰箱 24 2015-08-01 09:08:14
2 小李 空调 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没有的部分
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前题目:SparkSQL测试JoinType中所有join的类型,便于理解-创新互联
网站路径:http://myzitong.com/article/dihpdi.html