在复杂列上创建Hive索引

时间:2016-05-13 15:54:51

标签: sql hadoop struct hive hortonworks-data-platform

可以在配置单元中的复杂列上创建索引。复杂如map,struct,array等列。

示例:

CREATE TABLE employees (
  name         STRING,
  salary       FLOAT,
  subordinates ARRAY<STRING>,
  deductions   MAP<STRING, FLOAT>,
  address      STRUCT<street:STRING, city:STRING, state:STRING, zip:INT>
)
PARTITIONED BY (country STRING, state STRING);

以下似乎不起作用:

CREATE INDEX employees_index
ON TABLE employees (address.street)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD;

失败:ParseException行2:28输入不匹配'。'期待)创建索引声明中的“地址”附近

2 个答案:

答案 0 :(得分:2)

无法在复杂数据类型的元素上创建索引。 原因是hive不为复杂数据类型的元素提供单独的列,并且只能在表的列上进行索引。 要了解更清楚,请阅读以下内容。

Hive索引的目标是提高表的某些列的查询查询速度。如果没有索引,带有谓词的查询(如'WHERE tab1.col1 = 10')会加载整个表或分区并处理所有行。但是如果col1存在索引,则只需要加载和处理文件的一部分。 索引可以提供的查询速度的提高是以创建索引和磁盘空间来存储索引的额外处理为代价的。

以下是在复杂数据类型

上创建索引的正确方法
CREATE INDEX employees_index
ON TABLE employees (address)
AS ‘org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler’
WITH DEFERRED REBUILD
IN TABLE employees_index_table
PARTITIONED BY (country,name)
COMMENT ‘index based on complex column’;

让我们了解这个程序将如何运作, 假设我们编写了以下查询,

 select * from employees where address.street='baker';

在这个面包师中是地址元素(复杂类型STRUCT)
(例如街道:'baker',城市:'伦敦',州:'XYZ',邮编:84902)

在上面的示例中,查询将在索引表中搜索address.street ='baker',而不是加载整个表

希望你觉得它很有用。 谢谢。

答案 1 :(得分:1)

我们只能在不在列元素上的列上创建索引。

https://cwiki.apache.org/confluence/display/Hive/IndexDev

在您的给定样本表中,地址是列, address.street 是该列的元素。

地址索引是可能的..