Hive性能优化之ORC索引–Row Group Index vs Bloom Filter Index

Row Group Index

一个ORC文件包含一个或多个stripes(groups of row data),每个stripe中包含了每个columnmin/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;

    原文作者:mingchenghe
    原文地址: https://www.jianshu.com/p/afba608d4632
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞