hive 索引

一、Hive的索引

索引是标准的数据库技术,hive 0.7版本之后支持索引。Hive提供有限的索引功能,这不像传统的关系型数据库那样有“键(key)”的概念,用户可以在某些列上创建索引来加速某些操作,给一个表创建的索引数据被保存在另外的表中。 Hive的索引功能现在还相对较晚,提供的选项还较少。但是,索引被设计为可使用内置的可插拔的java代码来定制,用户可以扩展这个功能来满足自己的需求。 当然不是说有的查询都会受惠于Hive索引。用户可以使用EXPLAIN语法来分析HiveQL语句是否可以使用索引来提升用户查询的性能。像RDBMS中的索引一样,需要评估索引创建的是否合理,毕竟,索引需要更多的磁盘空间,并且创建维护索引也会有一定的代价。 用户必须要权衡从索引得到的好处和代价。

索引的建立

先创建hive表

hive> create table user( id int, namestring) 

   > ROW FORMAT DELIMITED 

   > FIELDS TERMINATED BY '\t'

> STORED AS TEXTFILE;

导入数据

hive> load data local inpath '/usr/local/trl/row.txt'

   > overwrite into table user;

 

Select*from use---------------------------à耗时10秒

 

对user建立索引

hive> create index user_index on tableuser(id)

   > as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'

   > with deferred rebuild

   > IN TABLE user_index_table;

hive> alter index user_index on userrebuild;

hive> select * from user_index_table;

  耗时9s这和没有创建索引的效果差不多

1. order by会对查询结果集做一次全局的排序,也就是说所有的数据都传给一个reduce来处理对于大数据集来说,这个过程可能很慢

2. sort by只会在每一个reduce中进行排序,这样只保证每个reduce的输出数据是有序的(并非全局排序),这样可以提高后面全局排序的效率。

3.union all 用于多表合并的场景,要求各表select出的字段类型必须完全匹配

  用于多表不同字段的结果表进行合并操作

  hive不支持顶层union,只能union封装在子查询中,而且必须有别名

4.hive索引

  索引key冗余存储,提供基于key的数据视图

  存储设计优化查询和检索性能

  对某些查询减少IO

### 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、付费专栏及课程。

余额充值