Hive的索引

Hive支持索引,但是Hive的索引与关系型数据库中的索引并不相同,比如,Hive不支持主键或者外键。

Hive索引可以建立在表中的某些列上,以提升一些操作的效率,例如减少MapReduce任务中需要读取的数据块的数量。

在可以预见到分区数据非常庞大的情况下,分桶和索引常常是优于分区的。而分桶由于SMB Join对关联键要求严格,所以并不是总能生效。

Hive原始索引

Hive的索引目的是提高Hive表指定列的查询速度。

Hive索引是Hive中用于提高查询性能的一种机制。它们类似于传统数据库中的索引,可以加速数据检索操作。在Hive中,索引可以被创建在表的列上,以便更快地定位和检索数据。这对于大规模数据分析场景非常有用,可以加速复杂查询的执行。

没有索引时,类似'WHERE tab1.col1 = 10' 的查询,Hive会加载整张表或分区,然后处理所有的rows,但是如果在字段col1上面存在索引时,那么只会加载和处理文件的一部分。

在每次建立、更新数据后,Hive索引不会自动更新,需要手动进行更新(重建索引以构建索引表),会触发一个MapReduce job。

Hive索引使用过程繁杂,而且性能一般,在Hive3.0中已被删除,在工作环境中不推荐优先使用,在分区数量过多或查询字段不是分区字段时,索引可以作为补充方案同时使用。推荐使用ORC文件格式的索引类型进行查询。

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

条件:
    1) 要求表必须是ORC存储格式
    2) 需要对那个字段进行索引, 必须对这个字段进行排序, 否则索引意义不大
    3) 在创建表的时候, 必须开启行组索引: ’orc.create.index’=’true’
    4) 主要应用在 < > = 场景中, 主要针对数值类型数据
​
建表操作: 
CREATE TABLE lxw1234_orc2(
    ....
) stored AS ORC
TBLPROPERTIES
(
    'orc.compress'='SNAPPY',
--     开启行组索引
    'orc.create.index'='true'
)
​
插入数据:
    SELECT CAST(siteid AS INT) AS id,
    pcid
    FROM lxw1234_text
--     插入的数据保持排序
    DISTRIBUTE BY id sort BY id;
Bloom Filter Index(布隆过滤索引)

在建表时候,通过表参数”orc.bloom.filter.columns”=”pcid”来指定为那些字段建立BloomFilter索引,这样,在生成数据的时候,会在每个stripe中,为该字段建立BloomFilter的数据结构,当查询条件中包含对该字段的=号过滤时候,先从BloomFilter中获取以下是否包含该值,如果不包含,则跳过该stripe。

条件:
    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"
)
​
插入数据: 
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关联字段 以及清洗字段

### Hive 索引的关键概念与使用指南 Hive 提供了一种创建索引的功能,用于加速特定类型的查询。尽管 Hive 并不像传统的关系型数据库那样频繁地利用索引来优化性能,但在某些场景下仍然非常有用。 #### 1. 创建索引Hive 中,可以通过 `CREATE INDEX` 命令为表上的某一列或多列创建索引。以下是基本语法: ```sql CREATE [BITMAP] INDEX index_name ON TABLE base_table_name (col_name, ...) AS 'index_handler_class' WITH DEFERRED REBUILD [IN TABLESPACE tablespace_name] [INDEXPROPERTIES (property_name=property_value)]; ``` - **index_name**: 要创建的索引名称。 - **base_table_name**: 底层数据所在的表名。 - **col_name**: 列名,即需要建立索引的列。 - **index_handler_class**: 指定使用的索引处理器类,默认情况下是 `COMPACT` 或者 `BITMAP` 类型[^4]。 例如,下面的例子展示了如何在一个名为 `employees` 的表上基于 `department_id` 字段构建一个紧凑型索引: ```sql CREATE INDEX emp_dept_idx ON TABLE employees(department_id) AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'; ``` --- #### 2. 更新索引 由于 Hive 是面向批量处理的大数据分析工具,它不会自动维护索引的状态。每当底层数据发生变化时(如插入新记录),都需要手动重建索引。可以使用以下命令完成这项工作: ```sql ALTER INDEX index_name ON TABLE base_table_name REBUILD; ``` 这条语句会触发 MapReduce 任务去扫描整个表格并更新对应的索引文件[^3]。 --- #### 3. 删除索引 如果某个索引已经不再需要,则应该将其删除以释放存储资源。执行如下 SQL 即可实现目的: ```sql DROP INDEX [IF EXISTS] index_name ON TABLE base_table_name; ``` 注意这里同样支持条件判断选项 `[IF EXISTS]` 来防止因尝试移除不存在对象而引发错误警告信息输出[^1]。 --- #### 4. 查询计划中的索引应用 为了验证是否成功启用了所建好的索引机制参与计算过程,我们通常查看 EXPLAIN 输出结果来分析实际运行路径。假如一切正常的话,在阶段划分里应当能看到类似于这样的片段描述:“Using compact indexes...”。 另外值得注意的一点在于,并非所有的操作都可以享受到来自预先准备好的辅助结构所带来的好处;只有那些满足一定模式匹配规则限定范围内的请求才会考虑调用这些预加工产物作为快捷通道的一部分[^2]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值