Hive中索引的使用及注意事项

川长思鸟来 2022-05-24 09:15 365阅读 0赞
索引的作用

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

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

在可以预见到分区数据非常庞大的情况下,索引常常是优于分区的。

虽然Hive并不像事物数据库那样针对个别的行来执行查询、更新、删除等操作。它更多的用在多任务节点的场景下,快速地全表扫描大规模数据。但是在某些场景下,建立索引还是可以提高Hive表指定列的查询速度。(虽然效果差强人意)

索引适用的场景

适用于不更新的静态字段。以免总是重建索引数据。每次建立、更新数据后,都要重建索引以构建索引表。

Hive索引的机制如下:

hive在指定列上建立索引,会产生一张索引表(Hive的一张物理表),里面的字段包括,索引列的值、该值对应的HDFS文件路径、该值在文件中的偏移量;

v0.8后引入bitmap索引处理器,这个处理器适用于排重后,值较少的列(例如,某字段的取值只可能是几个枚举值)

因为索引是用空间换时间,索引列的取值过多会导致建立bitmap索引表过大。

但是,很少遇到hive用索引的。说明还是有缺陷or不合适的地方的。

索引的建立与使用

语法如下:

  1. CREATE INDEX index_name
  2. ON TABLE base_table_name (col_name, ...)
  3. AS 'index.handler.class.name'
  4. [WITH DEFERRED REBUILD]
  5. [IDXPROPERTIES (property_name=property_value, ...)]
  6. [IN TABLE index_table_name]
  7. [PARTITIONED BY (col_name, ...)]
  8. [
  9. [ ROW FORMAT ...] STORED AS ...
  10. | STORED BY ...
  11. ]
  12. [LOCATION hdfs_path]
  13. [TBLPROPERTIES (...)]
  14. [COMMENT "index comment"]

AS …语句指定了 索引处理器,也就是一个实现了索引接口的Java类。

建立完索引之后 需要重建索引数据,会触发一个mr job

  1. ALTER INDEX employee_index
  2. ON TABLE employee
  3. PARTITION (country = 'US')
  4. REBUILD;

建立完可以通过显示命令显示索引

  1. SHOW FORMATTED INDEX ON employees;

想要索引在查询时,生效,还得设置使用索引:默认是不使用的。

  1. SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;
  2. SET hive.optimize.index.filter=true;
  3. SET hive.optimize.index.filter.compact.minsize=0;

最后,删除索引的语法如下:

  1. DROP INDEX IF EXISTS employees_index ON TABLE employees;

发表评论

表情:
评论列表 (有 0 条评论,365人围观)

还没有评论,来说两句吧...

相关阅读

    相关 使用索引注意事项

    * 为经常需要搜索的列加索引,可以加快索引的速度 * 主键列上可以确保列的唯一性 * 在表与表的连接条件上加索引,可以加快连接查询的速度 * 在经常需要排序...

    相关 mysql索引使用技巧注意事项

    一.索引的作用        一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作

    相关 hive注意事项

    (1)hive中创建的表存储在mysql中和hdfs的/user/hive/warehouse路径下 表中的元数据存储在mysql中 (2)hive中创建的外部表在工作中最

    相关 MySQL索引使用注意事项

    MySQL索引使用的注意事项 MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,在索引的使用过程中,存在一些使用细节和注意事项。 不要在列上

    相关 MySQL 索引使用注意事项

    索引不会包含有 `NULL` 的列 只要列中包含有 `NULL` 值,都将不会被包含在索引中,复合索引中只要有一列含有 `NULL` 值,那么这一列对于此符合索引就是无效的。