Hive的join语句

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xiao__jia__jia/article/details/102637187

                       Hive的join语句

目录

一、INNER JOIN(Hive默认的JOIN)

二、JOIN优化

三、LEFT OUTER JOIN

四、RIGHT OUTER JOIN

五、FULL OUTER JOIN

六、LEFT SEMI-JOIN

七、笛卡尔积 JOIN

八、map-side JOIN


一、INNER JOIN(Hive默认的JOIN)

只有进行连接的两个表中都存在与连接标准相匹配的数据才会被保留下来。
如下图:ymd字段内容必须相等,它是这个查询语句中的连接关键字。当join别的表,如果本表该字段有数据,别的表对应的为null,那么该数据将匹配不到。

同时,Hive目前还不支持在ON子句中的谓词间使用OR,但可以使用AND。
例如: select * from a join b on a.word = b.word and a.size = b.size;
当涉及到多个表的join时,hive总是按照从左到右的顺序执行的。


二、JOIN优化

当对3个或者更多个表进行join连接时,如果每个on子句都使用相同的连接键的话,那么只会产生一个MapReduce job。
否则,当两张表join时,产生一个MapReduce job, 再与第三张表join时又会产生新的MapReduce job。
在对每行记录进行连接操作时,它会尝试将其他表缓存起来,然后扫描最后那个表进行计算。优化时最好保证连续查询中的表的大小从左到右是依次增加的。
数据集大的话,这样优化的性能比较明显。也可以用一个“标记”机制来显式地告知查询优化器哪张表是大表。如下图:
 

现在Hive将会尝试将表stocks作为驱动表,即使其在查询中不是位于最后面的。


三、LEFT OUTER JOIN

在这种join连接操作中,join操作符左边表中符合where子句的所有记录将会被返回。join操作符右边中如果没有符合on后面连接条件的记录时,那么从右边表指定选择的列的值将会是NULL。

四、OUTER JOIN
对于外连接,where语句在连接操作(join)执行后才会执行where过滤,因此where语句应该只用于过滤那些非NULL值的列值。
举个例子:

为了提高前面那个查询的执行速度,增加了谓词限定,这时会影响输出结果,变成了和之前的内连接一样的结果。
解决方案:使用嵌套select语句:


四、RIGHT OUTER JOIN

在这种join连接操作中,join操作符右边表中符合where子句的所有记录将会被返回。join操作符左边中如果没有符合on后面连接条件的记录时,那么从左边表指定选择的列的值将会是NULL。

五、FULL OUTER JOIN

如果任一表的指定字段没有符合条件的值的话,那么就使用NUL值进行替换。


六、LEFT SEMI-JOIN

效果比通常的INNER JOIN要更高效。原因如下:对于左表中一条指定的记录,在右边表中一旦找到匹配的记录,Hive就会立即停止扫描,进行左表下一条指令的匹配。
用法:SELECT 和WHERE 语句中不能引用到右表中的字段。Hive只支持左半开,不支持右半开。
例子:
 


七、笛卡尔积 JOIN

左边表有5行数据,右边表有6行数据,产生的结果将是30行数据:

select * fromstocks join dividends;

执行笛卡尔积join,这个过程经常会消耗很长的时间,运行缓慢。
如果设置属性hive.mapred.mode值为strict的话,Hive会阻止用户执行笛卡尔积查询。


八、map-side JOIN

当所有表中只有一张表是小表,可以在最大的表通过mapper的时候将小表完全放到内存中,与内存中的小表进行逐一匹配,省略掉常规链接操作所需要的reduce过程,有时还可以同时减少map过程的执行步骤。
在Hive v0.7之前的版本,需要增加一个标记来触发。

之后的版本废弃了这种标记方式,通过设置属性hive.auto.convert.join,默认值是false,需要开启。

配置能够使用这个优化的小表的大小:

hive.mapjoin.smalltable.filesize = 25000000

如果需要自动启动这个优化,可以将这些属性设置在$HOME/.hiverc文件中。
对于right out join 和 full outer join 不支持这个优化。
 

猜你喜欢

转载自blog.csdn.net/xiao__jia__jia/article/details/102637187
今日推荐