Row Group Index
一個(gè)ORC文件包含一個(gè)或多個(gè)stripes(groups of row data)伞租,每個(gè)stripe中包含了每個(gè)column的min/max值的索引數(shù)據(jù)法挨,當(dāng)查詢中有<,>,=的操作時(shí),會(huì)根據(jù)min/max值墨叛,跳過掃描不包含的stripes震放。
而其中為每個(gè)stripe建立的包含min/max值的索引夫椭,就稱為Row Group Index,也叫min-max Index锭碳,或者Storage Index戏蔑。在建立ORC格式表時(shí)蹋凝,指定表參數(shù)’orc.create.index’=’true’之后,便會(huì)建立Row Group Index总棵,需要注意的是鳍寂,為了使Row Group Index有效利用,向表中加載數(shù)據(jù)時(shí)情龄,必須對(duì)需要使用索引的字段進(jìn)行排序迄汛,否則,min/max會(huì)失去意義骤视。另外鞍爱,這種索引通常用于數(shù)值型字段的查詢過濾優(yōu)化上。
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
在建表時(shí)候专酗,通過表參數(shù)”orc.bloom.filter.columns”=”pcid”來指定為那些字段建立BloomFilter索引睹逃,這樣,在生成數(shù)據(jù)的時(shí)候祷肯,會(huì)在每個(gè)stripe中沉填,為該字段建立BloomFilter的數(shù)據(jù)結(jié)構(gòu),當(dāng)查詢條件中包含對(duì)該字段的=號(hào)過濾時(shí)候佑笋,先從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;