hive的索引
一、索引的介绍
索引的作用:加快查询的效率
为什么索引可以提升查询效率呢?
二、hive的索引
hive索引是在 分区 分桶优化基础上, 又提供一种新的优化手段, 如果分区 和分桶受限, 可以尝试使用索引的方式来优化处理
hive提供了三种索引:
原始索引
row group index(行组索引)
bloom filter index(布隆过滤索引)
1、hive的原始索引
结论: 此索引已经不再使用, 在hive3.0以上, 彻底不支持
hive的原始索引, 可以针对表中某一列或者某几列构建索引, 构建之后, 当查询的时候使用到索引字段, 可以帮助提升一定效率
弊端:
hive原始索引, 不会自动更新, 每一次对表中数据进行处理后, 都需要进行重建索引, 而这个效率是比较差, 而且整体效率的提升,相对比较有限
2、row group index(行组索引)
条件
1) 要求表必须是ORC存储格式
2) 需要对那个字段进行索引, 必须对这个字段进行排序, 否则索引意义不大
3) 在创建表的时候, 必须开启行组索引: ’orc.create.index’=’true’
4) 主要应用在 < > = 场景中, 主要针对数值类型数据
ORC是一种专为大数据优化的列存储格式,具有以下特点:
1)高效压缩:按列存储相似数据,压缩率比行存储高 3-5 倍,节省存储空间。
2)快速查询:内置多级索引(文件、stripe、行组),支持跳过无关数据,加速过滤和聚合。
3)复杂类型支持:原生支持嵌套结构(如 JSON / 数组),适合半结构化数据。
4)事务支持:结合 Hive 实现 ACID 事务(插入 / 更新 / 删除)。
5)这就是orc存储格式
常用于 Hive、Spark 等框架,是数据仓库的主流存储格式,适合批量分析场景。
建表操作
CREATE TABLE lxw1234_orc2(
....
) stored AS ORC
TBLPROPERTIES
(
'orc.compress'='SNAPPY',
-- 开启行组索引
'orc.create.index'='true'
)
stored AS ORC
指定使用 ORC(Optimized Row Columnar) 存储格式,这是一种高效的列存格式,适合大数据分析。
'orc.compress'='SNAPPY'
:启用 Snappy 压缩,在压缩率和性能间平衡,适合快速读写场景。
'orc.create.index'='true'
:开启 ORC 行组索引,记录每个行组的统计信息(如最小值、最大值),加速数据过滤。
插入数据
insert into table xxxx
SELECT CAST(siteid AS INT) AS id,
pcid
FROM lxw1234_text
-- 插入的数据保持排序
DISTRIBUTE BY id sort BY id;
CAST(siteid AS INT) AS id
将 siteid
字段从字符串转为整数类型,并命名为 id
DISTRIBUTE BY id
:按 id
的哈希值将数据分发到不同的 Reducer,确保相同 id
的记录被分到同一节点
3、bloom filter index(布隆过滤索引)
行组索引可以和布隆索引一起使用
条件
1) 必须是ORC类型的表
2) 需要按照哪一个字段进行等值连接, 就需要对这个字段构建布隆索引
3) 仅适合做等值连接, 不局限于数据类型
4) 在建表的时候, 必须指定为那些字段开启: ”orc.bloom.filter.columns”=”pcid,字段2..”
建表操作
CREATE TABLE lxw1234_orc2 (
....
) stored AS ORC
TBLPROPERTIES
(
'orc.compress'='SNAPPY',
'orc.create.index'='true',
-- pcid字段开启BloomFilter索引
"orc.bloom.filter.columns"="pcid"
)
插入数据
insert into table xxxx
SELECT CAST(siteid AS INT) AS id,
pcid
FROM lxw1234_text
DISTRIBUTE BY id sort BY id;
使用索引
SET hive.optimize.index.filter=true --开启 hive的自动使用索引
SELECT COUNT(1) FROM lxw1234_orc1 WHERE id >= 0 AND id <= 1000 (行组索引)
AND pcid IN ('0005E26F0DCCDB56F9041C','A'); (布隆过滤索引)
注意 如果要使用hive的索引, 必须开启hive自动使用索引
SET hive.optimize.index.filter=true --开启 hive的自动使用索引
当然也可以将这个配置, 直接配置到cm的hive的配置窗口中, 进行统一配置
在生产中这些索引如何选择呢?
1) 对于行组索引, 建议是常开即可
在插入数据, 如果不明确对那个字段使用行组索引, 可以任意的插入, 在条件合适情况下, 也在使用行组索引
2) 布隆过滤索引: 主要将那些用于 等值连接的字段开启索引即可
一般主要指的是 join关联字段 以及清洗字段