准备 测试数据
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没有的部分