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