可以在配置单元中的复杂列上创建索引。复杂,如在映射、结构、数组等列中。
示例:
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的输入"不匹配应为)在创建索引语句中的"address"附近
不可能对复杂数据类型的元素创建索引。原因是配置单元不能为复杂数据类型的元素提供单独的列,并且只能对表的列进行索引。要更清楚地理解,请阅读以下内容。
配置单元索引的目标是提高表中某些列的查询查找速度。在没有索引的情况下,使用谓词(如"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';
在这个baker中是地址元素(复杂类型STRUCT)
(例如街道:"贝克",城市:"伦敦",州:"XYZ",邮编:84902)
在上面的例子中,查询将在索引表中搜索地址.street="制造商",而不是加载整个表
希望你觉得它有用。非常感谢。
我们只能在列上创建索引,而不能在列的元素上创建索引。
https://cwiki.apache.org/confluence/display/Hive/IndexDev
在给定的示例表中,地址是列,address.street则是该列的元素。
可以对地址进行索引。。