Hive 索引

Hive 索引,第1张

Hive 索引 1 Hive 索引

Hive的索引目的是提高Hive表指定列的查询速度。
没有索引时,类似'WHERe tab1.col1 = 10' 的查询,Hive会加载整张表或分区,然后处理所有
的rows,但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分。
在每次建立、更新数据后,Hive索引不会自动更新,需要手动进行更新(重建索引以构建索引
表),会触发一个mr job。
Hive索引使用过程繁杂,而且性能一般,在Hive3.0中已被删除,在工作环境中不推荐优先使用,在分区数量过多或查询字段不是分区字段时,索引可以作为补充方案同时使用。推荐使用ORC文件格式的索引类型进行查询。

2 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会失去意义。另外,这种索引主要用于 数值型字段的查询过滤优化上。
设置 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;

3 Bloom Filter Index

在建表时候,通过表参数”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 ('0005E26F0DCCDB56F9041C','A');
只有在数据量较大时,使用索引才能带来性能优势。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5700599.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存