Row Group Index
一个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会失去意义。另外,这种索引通常用于数值型字段的查询过滤优化上。
SET hive.optimize.index.filter=true;
SELECT COUNT(1)FROM lxw1234_orc1 WHERE id>=0AND id<=1000
AND pcid IN(‘0005E26F0DCCDB56F9041C’,’A’);
Bloom Filter Index
在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的=号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe.
看下面的建表语句,为pcid字段建立BloomFilter索引:
CREATE TABLE lxw1234_orc2 stored AS ORC
TBLPROPERTIES
(‘orc.compress’=’SNAPPY’,
‘orc.create.index’=’true’,
“orc.bloom.filter.columns”=”pcid”,
‘orc.bloom.filter.fpp’=’0.05’,
‘orc.stripe.size’=’10485760’,
‘orc.row.index.stride’=’10000’)
AS
SELECT CAST(siteid AS INT)AS id,
pcid
FROM lxw1234_text
DISTRIBUTE BY id sort BY id;