一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个column的min/max值的索引数据,当查询中有<,>,=的操作时,会根据min/max值,跳过扫描不包含的stripes。
而其中为每个stripe建立的包含min/max值的索引,就称为Row Group Index行组索引,也叫min-max Index大小对比索引,或者Storage Index。
在建立ORC格式表时,指定表参数’orc.create.index’=’true’之后,便会建立Row Group Index,需要注意的是,为了使Row Group Index有效利用,向表中加载数据时,必须对需要使用索引的字段进行排序,否则,min/max会失去意义。另外,这种索引主要用于 数值型字段的查询过滤优化上。
设置 hive.optimize.index.filter为true,并重启hive
创建表/插入数据
create table lxw1234_orc2 stored as orc tblproperties ( 'orc.compress'='SNAPPY', -- 开启行组索引 'orc.create.index'='true' ) as select cast(siteid as int) as id, pcid from lxw1234_text -- 插入的数据保持排序 distribute by id sort by id;
查询
set hive.optimize.index.filter=true; select count(1) from lxw1234_orc1 where id >= 1382 and id <= 1399;
在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的 = 号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe。
创建
create table lxw1234_orc2 stored as orc tblproperties ( 'orc.compress'='SNAPPY', 'orc.create.index'='true', -- pcid字段开启BloomFilter索引 'orc.bloom.filter.columns'='pcid' ) as select cast(siteid as int) as id, pcid from lxw1234_text distribute by id sort by id;
查询
set hive.optimize.index.filter=true; select count(1) from lxw1234_orc1 where id >= 0 and id <= 1000 and pcid in ('00005E25F0CDD', 'A');