在复杂列上创建配置单元索引

inn6fuwd  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(525)

可以在配置单元中的复杂列上创建索引。复杂的,如在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 create index语句中“address”附近的输入“.”不匹配

h5qlskok

h5qlskok1#

我们只能在列上创建索引,不能在列的元素上创建索引。
https://cwiki.apache.org/confluence/display/hive/indexdev
在给定的示例表中,address是列,address.street是该列的元素。
地址索引是可能的。。

dauxcl2d

dauxcl2d2#

无法在复杂数据类型的元素上创建索引。原因是hive不提供复杂数据类型的单独列到元素,索引只能在表的列上进行。要更清楚地理解,请阅读下面的内容。
配置单元索引的目标是提高表中某些列的查询查找速度。如果没有索引,使用“where tab1.col1=10”等 predicate 的查询将加载整个表或分区并处理所有行。但是,如果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中是address元素(复杂类型struct)
(例如街道:'baker',城市:'london',州:'xyz',zip:84902)
在上面的示例中,查询将在索引表中搜索address.street='baker',而不是加载整个表
希望你觉得有用。谢谢您。

相关问题