hive索引

本文介绍了Hive的三种索引类型:Local Index、Cube和Global Index。Local Index通过字典编码技术提高过滤速度,Cube针对高聚合率优化查询效率,而Global Index通过定位文件位置减少不必要的数据读取。文章详细阐述了每种索引的特性和创建方法,并给出了创建Local Index和Cube的示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hive的索引包括三种:Local Index、Cube和Global Index。接下来分别进行介绍。

通俗的说:global index,标记记录在哪个文件。local index,标记记录在单个文件里哪个位置。cube,类似local index,同时对多个字段做索引。

 

Local Index是将列式存储的每个单元看作整体建立的。Local Index的创建采用了字典编码技术。相对于通过遍历每一条记录进行条件过滤的手段,使用Local Index大幅度缩短了过滤时间。

Cube是对相关字段聚合信息的整理,Cube对于聚合率高的情况有很好的优化效应。如果没有采用Cube,有可能要依次读取出每个block中的记录。而创建了Cube之后,可以直接获取需要的聚合信息,减少对原表的读取(最差情况数量相同),所以创建有效的Cube可以使查询效率更高。

Local Index和Cube支持的数据类
型:boolean,byte,short,int,float,double,long,date,timestamp,decimal,string,varchar,
不支持嵌套类型。

以下将分别介绍创建Local Index和Cube的语法。
1. 创建Local Index的语法:

CREATE TABLE <holodesk_table_name>(
<column_name1> <DATATYPE1>,
<column_name2> <DATATYPE2>,
...
) STORED AS HOLODESK WITH TABLESIZE <table_size>
TBLPROPERTIES (
"holodesk.index" = "<localindex_key1>,<localindex_key2>,..."
);

2. Cube
创建Cube的语法:

CREATE TABLE <holodesk_table_name>(
<column_name1> <DATATYPE1>,
<column_name2> <DATATYPE2>,
...
) STORED AS HOLODESK WITH TABLESIZE <table_size>
TBLPROPERTIES (
"holodesk.dimension" = "<cube1_dim1>, <cube1_dim2>, ... |
<cube2_dim1>, <cube2_dim2>, ...|
..."
) ;

 

例 48. 针对某应用场景设计Holodesk表的创建
假设对于holodeskEmployee表将有如下的查询语句:

SELECT Sex, Region, COUNT(ID) AS cnt, AVG (Salary) AS avg_salary
FROM holodeskEmployee
WHERE Department = 'IT'
GROUP BY Sex, Region
ORDER BY Sex, Region;


如果在建表时为“Department”字段建立Local Index,根据(“Sex”,“Region”)建立Cube,则有助于提升查询效率,原因如下:
• WHERE 中的条件对“Department”的值进行过滤,如果为“Department”创建Index,就可以通过索引直接获得满足“Department = 'IT'”的所有记录,而不用遍历整张表。
根据(“Sex”, “Region”)建立Cube将整合出基于“Sex”和“Region”两个字段的所有聚合信息,并保存于HashMap 中。实时计算聚合函数所消耗的时间。
所以应该通过如下语句建表并创建相应Local Index、Cube,并从Employee 导入数据:

DROP TABLE IF EXISTS holodeskEmployee;
CREATE TABLE holodeskEmployee
STORED AS HOLODESK WITH TABLESIZE 10MB
TBLPROPERTIES (
"holodesk.index" = "Department",
"holodesk.dimension" = "Sex, Region"
) AS SELECT * FROM employee1;

 

Global Index
创建Global Index的同时会生成一张GI表,用于存储Key所在的文件位置,在执行查询语句时,会先查GI表,定位Key所在的文件,过滤掉不必要的文件,从而提高执行效率。查GI表会造成少量额外的时间开销,所以Global Index适合建在高过滤率的字段,可有效减少task数量,这是Local Index和Cube做不到的。假设为destination字段创建Global Index,生成的对应的GI表大致如下所示:

 1. 创建Global Index

CREATE TABLE <holodesk_table_name>(
<column_name1> <DATATYPE1>,
<column_name2> <DATATYPE2>,
...
) STORED AS HOLODESK WITH TABLESIZE <table_size>
TBLPROPERTIES (
"HOLODESK.GLOBALINDEX" = "<globalindex_key1>,<globalindex_key2>,...", ① ②
"GLOBALINDEX.BUCKET" = "<globalindex_bucket_number>" ③
);

① Global Index支持的数据类型:int,double,float,string(n),varchar
(m),long,byte,short,boolean,date。
② HOLODESK.GLOBALINDEX与GLOBALINDEX.BUCKET需同时指定。
③ GLOBALINDEX.BUCKET计算公式:GLOBALINDEX.BUCKET=1/10原表大小÷100M。即十分之一原表大小除
以100M。

2. 导入数据

INSERT INTO <holodesk_table_name>
SELECT * FROM table_B;

 

 

参考资料:

星环

Transwarp ArgoDB使用手册

https://www.warpcloud.cn/#/documents-support/docs-detail/document/ARGODB-PLATFORM/1.2/030ArgoDBManual?docType=products%3Fcategory%3DTDH&docName=ArgoDB%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C

章节:4.4索引

### 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]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值