本文共 6047 字,大约阅读时间需要 20 分钟。
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分割
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)
默认是 `inner`. 必须是以下类型的一种:`inner`, `cross`, `outer`, `full`, `full_outer`, `left`, `left_outer`,`right`, `right_outer`, `left_semi`, `left_anti`.
不指定
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的交集。
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完全等价
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等价
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交集
scala> trade.join(order,trade("o_id")===order("o_id"),"left_semi").show+----+------+-----+----------+|o_id|seller|buyer|buyer_city|+----+------+-----+----------+| 1| A| 小王| 北京|| 2| B| 小李| 天津|+----+------+-----+----------+
过滤出两DF共有的部分
cala> trade.join(order,trade("o_id")===order("o_id"),"left_anti").show+----+------+-----+----------+|o_id|seller|buyer|buyer_city|+----+------+-----+----------+| 3| A| 小刘| 北京|+----+------+-----+----------+
过滤出DF2中DF1没有的部分
转载于:https://blog.51cto.com/14309075/2400132