设为首页 加入收藏

TOP

Hive[6] HiveQL 查询(三)
2019-09-03 03:28:08 】 浏览:58
Tags:Hive HiveQL 查询
bm' AND c.symbol='ge';
大多数情况下,Hive 会对每个 JOIN 链接对象启动一个 MapReduce 任务,上面例子中会首先启动一个 MapReduce job 对表 a 和表 b 进行连接操作,然后会再启动一个 MapReduce job 将第一个 MapReduce job 的输出和和 c 进行连接操作;【hive 都是从左向右运顺序执行的】
 
【提示】
对于3个或者更多表进行 JOIN 链接时,如果每个 ON 子句都使用相同的链接键的话,那么只会产生一个 MapReduce;Hive 同时假定查询中最后一个表是最大的那个表,在对每行记录进行链接操时,它会尝将其他表缓存起来,然后扫描最后那个大表进计算,因此我们需要保证连续查询中的表的大小从左到右是依次增加的;
 
LEFT OUTER JOIN 左外链接【与SQL用法类似】
hive> SELECT s.ymd,  s.symbol, s.price_close,  d.dividend FROM stocks s LEFT OUTER JION dividends d ON 
>s.ydm AND s.symbol=d.symbol WHERE s.symbol='aapl' ; 
在左外链接操作中, JOIN 操作符左边表中符合 WHERE 子句的所有记录将会被返回,右边表中没有符合 ON 后面的链接记录时,会返回 null; 
【提示】WHERE 语句在连接操作执行后才会执行,因此 WHERE 语句应该只用于过滤那些非null值的列,同时,ON 语句中的分区过滤条件外链接(OUTER JOIN)中是无效的,不过在内链接中是有效的;
 
RIGHT OUTER JOIN 右外链接:会返回右边表所有符合 WHERE 语句的记录,左表中没有匹配的字段值用 NULL 代替;
FULL OUTER JOIN 完全链接:将会返回所有表中符合 where 语句条件的所有记录;
LEFT SEMI JOIN 左半开链接:会返回左边表的记录,前提是其他记录对于右边表满足ON语句中的判断条件;【不支持右关开链接】
hive>SELECT s.ymd, s.symbol, s.price_close FROM stocks s LEFT SEMI JOIN dividends d ON s.ymd=d.ymd AND s.symbol=d.symbol;
 
Hive 不支持的查询:
hive>SELECT s.ymd, s.symbol, s.price_close FROM stocks s WHERE s.ymd,s.symbol IN(SELECT * FROM dividends d); 
 
JOIN 笛卡尔积:左边链接的行数乘以右边表的行数等于返回结果集的大小;
hive> SELECT * FROM stocks JOIN dividends; 
如果使用此方法查询,MapReduce 任何方式都无法法进行优化;
set hive.mapred.mode=strict 会禁止 笛卡尔积的查询;
 
map-side JOIN:如果所有表中只有一张表是小表,那么可以在最大的表通过 mapper 的时候将小表完全放到内存中,Hive可以在 map 端执行链接过程(称为 map-side JOIN); 因为 Hive 可以和内存中的小表进行逐一匹配,从而省略掉常规连接操作所需要的 reduce 过程 ,即使对于很小的数据庥,这个优化也明显要快于常规的连接操作,不仅减少了 reduce 过程 ,而且有时还可以同时减少 map 过程的执行步骤;
 
hive>set hive.auto.conver.JOIN=true;  从0.7版本开始需要设置此属性才可以生效
hive>set hive.mapjoin.smalltable.filesize=25000000;  配置能够使用这个优化的小表的大小;(单位:字节)
右外链接、全外链接不支持上面的优化;
 
分桶表,对于大表,在特定的情况下也可以使用这个优化,但表中的数据必须是按照ON 语句中的键进行分桶的,而且其中一张表的分桶的个数必须是另一张表分桶个数的若干倍,这样才可以按照分桶数据进行链接;hive>set hive.optimize.bucketmapJOIN=true; 也需要设置,默认是关闭的;
 
6.5 ORDER BY 和 SORT BY  P132
Hive 的 ORDER BY 语句和其他的 SQL 语言的定义都是一样。会对查询结果一个全局排序。也就是说会有一个所有的数据都通过一个 reducer 进行处理的过程,如果有大数据集,过程可能会消耗太过漫长的时间来执行;
 
Hive 还有一种排序 SORT BY ,其会在每个 reducer 中对数据进行排序,也就是会执行一个局部排序过程 ,这可以保证每个 reducer 的输出数据都是有序的(但不是全局有序)这样可以提高全局排序的效率;
SELECT s.ymd, s.symbol,  s.price_close FROM stocks s ORDER BY s.ymd ASC , s.symbol DESC;  order by 例子  
SELECT s.ymd, s.symbol,  s.price_close FROM stocks s SORT BY s.ymd ASC , s.symbol DESC;  sort by 例子  
注意:因为 ORDER BY 操作可能会导致运行时间过长,如果属性 hvie.mapred.mode=strict 的话,那么 hive 要求这样的语句必须加 LIMIT 语句进行限制,默认情况下 属性是 nonstrict;
 
6.6 SORT BY 与 DISTRIBUTE BY
distribute by 控制 map 的输出在 reducer 中是如何划分的。
假设我们希望具有相同股票交易码的数据在一起处理,那么我们可以使用 distribute by 来保证具有相同股票交易码的记录会分发到同一个 reducer 中进行处理,然后使用 SOTR BY 来按照我们的期望对数据进行排序:
hive>SELECT s.ymd, s.symbol, s.price_close FROM stocks s DISTRIBUTE BY s.symbol SORT BY s.symbol ASC, s.ymd ASC; 
 
DISTRIBUTE BY 和 GROUP BY  在其控制着 reducer 是如何接受一行行数据进行处理这方面类似类的,而 SORT BY 则控制着 reducer 内的数据是如何进行排序的。需要注意的是 DISTRIBUTE BY 语句一定要写在 SOTR BY 语句之前;
 
6.7 CLUSTER BY
在上面的例子中 s.symbol 列被用在 DISTRIBUTE BY 语
首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇DB2大数据量优化查询解决方案 下一篇R语言中的logical(0)和numeric(0)..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目