Hive相关函数(部分):
-
if函数:
-
select if(a=a,’bbbb’,111) fromlxw_dual; bbbb select if(1<2,100,200) fromlxw_dual; 200
-
nvl函数:
-
select nvl(principal,1) from mydb.aaaaa; 1
-
COALESCE函数
-
select COALESCE(null,’aaa’,50) from lxw_dual; aaa
-
CASE WHEN THEN 函数:
-
select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end from lxw_dual; mary select case 200 when 50 then 'tom'when 100 then 'mary' else 'tim' end from lxw_dual; tim
-
isnull() | isnotnull() 函数
hive的并行优化:
并行编译:
说明:
并行执行:
说明:
关于并行优化, 必须要求服务器有资源, 如果没有资源, 及时满足并行的条件, 也不会执行
Hive小文件合并:
HDFS中namenode中存储的元数据是什么?
小文件有什么影响呢?
从hive角度如何解决小文件过多的问题呢?
矢量化查询:
hive的默认查询执行引擎一次处理一行,而矢量化查询执行是一种hive特性,目的是按照每批1024行读取数据,并且一次性对整个记录整合(而不是对单条记录)应用操作,注意:要使用矢量化查询执行,就必须以ORC格式存储数据。
set hive.vectorized.execution.enabled=true;
读取零拷贝:
ORC可以使用新的HDFS缓存API和ZeroCopy读取器来避免在扫描文件时将额外的数据复制到内存中。
set hive.exec.orc.zerocopy=true;
数据倾斜的优化:
什么是数据倾斜呢?
数据倾斜会导致问题?
在执行什么SQL的时候, 会出现多个reduce的情况呢?
如何解决数据倾斜的问题呢?
group by 数据倾斜
join的数据倾斜
解决方案一 :
解决方案二:
建议:
如果提前知道表中有那些key有倾斜, 直接使用编译期即可
如果仅知道一部分, 对于其他key无法保证, 建议编译期和运行期同时开启
union all相关优化点:
如何感知有数据倾斜?
方案一: 通过查看 job history历史日志(19888) 适用于MR已经执行完成了。
方案二: 在运行过程中借助HUE查看:
关联优化器
在Hive的一些复杂关联查询中,可能同时还包含有group by等能够触发shuffle的操作,有些时候shuffle操作是可以共享的,通过关联优化器选项,可以尽量减少复杂查询中的shuffle,从而提升性能。
总结:
常开项:
set hive.exec.parallel=true; 是否开启并行执行
set hive.exec.parallel.thread.number=16; 最大允许并行执行的数量
set hive.vectorized.execution.enabled=true; 矢量化查询
set hive.exec.orc.zerocopy=true; 读取零拷贝
set hive.optimize.correlation=true; 关联优化器
针对性开启:
set hive.map.aggr=true; 开启 group by combiner数据倾斜方案
set hive.groupby.skewindata=true;开启groupby 负载均衡优化
set hive.optimize.skewjoin.compiletime=true; join的编译期优化
set hive.optimize.skewjoin=true; 是否开启运行期倾斜解决join
set hive.skewjoin.key=100000; 当key出现多少个的时候, 认为有倾斜
set hive.optimize.union.remove=true; union all优化