众所周知,当数据量大了的时候跑MapReduce任务是很容易崩掉的,但是当将数据量大的SQL语句转成MapReduce任务时候,很容易报 code2 的错误,就是内存不足,这时候我选择了对hive的数据表进行调优,主要使用行组索引与布隆索引这两种方式。
1、行组索引:row group index 将文件按行分成若干片段,每个片段都有min 和 max,当查询中有> < = 时候,会根据max/min值,扫描跳过不包含的片段.
在建立 ORC表格时候,指定表的参数orc.create.index=true 之后,便会建立ORC索引。在向表中加载数据时候,要对需要使用的字段进行排序,否则min/max就失去了意义。
另外,这种索引主要是针对数值类型的数据,设置hive.optimize.index.filter=true,并重启hive。
使用:保证建表时侯使用ORC的存储格式 stored as ORC ,并开启行组索引TBLPROPERTIES ( 'orc.compress'='SNAPPY', -- 开启行组索引 'orc.create.index'='true' )。
当插入数据有效并且使用>、<、= 时候会走行组索引
CREATE TABLE lxw1234_orc2 (字段列表 ....)
stored AS ORC
TBLPROPERTIES (
'orc.compress'='SNAPPY',
-- 开启行组索引
'orc.create.index'='true' )
2、 布隆索引:
1) 要求表的存储类型为 ORC存储方案
2) 在建表的时候, 必须设置为那些列构建布隆索引
3) 仅能适合于等值过滤查询操作
建表:ORC的文件存储格式,打开行组索引,打开布隆索引
CREATE TABLE lxw1234_orc2 (字段列表....)
stored as ORC
TBLPROPERTIES (
'orc.compress'='SNAPPY',
-- 开启 行组索引 (可选的, 支持全部都打开, 也可以仅开启一个) 'orc.create.index'='true',
-- pcid字段开启BloomFilter索引
'orc.bloom.filter.columns'='pcid,字段2,字段3...' )
行组索引与布隆索引的使用:
行组索引:建议只要数据存储格式为ORC, 将这种索引全部打开, 至于导入数据的时候, 如果能保证有序, 那最好, 如果保证不了, 也无所谓, 大不了这个索引的效率不是特别好
布隆索引:建议将后续会大量的用于等值连接的操作字段, 建立成布隆索引, 比如说: JOIN的字段 经常在where后面出现的等值连接字段