HQL与SQL中的JOIN操作

一.SQL中的连接

   左连接:左边表的内容全部存在,左表在右表中没有匹配项的右边值为空

   右链接:右边表的内容全部存在,右边在左表中没有匹配项的左边值为空

   内连接:普通的连接操作,通过(= > <)等符号进行连接

   全连接 :左右表数据都在,当对方表没有匹配项时数值为空

   例子

a表  num    name                                    b表    num   name   a_num

          1         zth                                                  1         zjw        3

          2         wn                                                   2         dsf        1

          3         xjk                                                    3        nbd       4

左连接: select * from a left join b on  a.num=b.a_num

 结果       1     zth      2    dsf    1

               2    wn       null  null  null

               3     xjk        1     zjw    3

右连接: select * from a right join b on  a.num=b.a_num

结果         3   xjk        1     zjw     3

                1   zth        2     dsf     1

                null  null  null  3  nbd   4

全连接:select * from a full join b on a.num=b.a_num

结果         1    zth     2   dsf       1

                2     wn    null

                3     xjk     1     zjw      3

                null          3     nbd     4


二.Hive中的连接

1.INNER JOIN

2.LEFT OUTER JOIN

3.RIGHT OUTER JOIN

4.FULL OUTER JOIN

5.LEFT SEMI JOIN

6.map-side JOIN

前四个与上边的四个操作基本相同,第五个是Hive中的join方法左半开连接

第五个左半开连接只会返回左边的信息,他比通常的INNER JOIN 更加高效,因为左边表中指定的列一旦找到匹配选项,Hive就会立即停止扫描。从这点来看,左边表中选择的列是可以预测的(Hive中并没有右半开连接)

第六个map-site join 是这样的,假如连接的两个表中有一个表是很小的表,我们就可以把表加载到内存当中,这样就可以在map端完成连接过程从而省略掉了reduce的过程,因为hive可以和内存中的小表进行逐一的匹配

用法:  在select后面加  /*+MAPJOIN(小表的名字) */  后边继续写

注意:这个功能默认是没有开启的需要设置一下参数 :set hive.optimize.bucketmapJOIN=true;

          还可以设置小表的大小:set hive.mapjoin.smalltable.filesize = 25000000

你可能感兴趣的:(hadoop,SQL)