HiveQL DDL—索引

本文详细介绍了Hive中索引的创建、查看、修改和删除操作,包括使用索引加速查询过程的原理,以及如何通过不同命令进行索引管理。

概述

  Hive的索引功能是在0.7版本引入的,从3.0开始该特性被移除(参考HIVE-18448.)。不过3.0引入了物化视图这一类似索引的技术。Hive使用索引是为了提高查询表中某些列的速度。如果没有索引,使用诸如’WHERE tab1.col1 = 10’这样的查询将会加载并处理整个表或分区中的记录。此时如果 col1 存在索引,就只需要加载和处理文件的一部分。这和使用列式存储格式(Parquet, ORC)有着相同的逻辑。

创建索引

CREATE INDEX index_name
ON TABLE base_table_name (col_name, ...)
AS 'index.handler.class.name'
[WITH DEFERRED REBUILD]
[IDXPROPERTIES (property_name=property_value, ...)]
[IN TABLE index_table_name]
[PARTITIONED BY (col_name, ...)]
[
   [ ROW FORMAT ...] STORED AS ...
   | STORED BY ...
]
[LOCATION hdfs_path]
[TBLPROPERTIES (...)]
[COMMENT "index comment"]

  示例

> CREATE INDEX test_index ON TABLE test_hive (name) AS 'COMPACT' WITH DEFERRED REBUILD;
--创建索引使用RCFile文件格式
> CREATE INDEX test_index2 ON TABLE test_hive (name) AS 'COMPACT' WITH DEFERRED REBUILD  STORED AS RCFILE;

查看索引

SHOW [FORMATTED] (INDEX|INDEXES) ON table_with_index [(FROM|IN) db_name];

  示例

> SHOW INDEX ON test_hive;
+-----------------------+-----------------------+-----------------------+-----------------------------------+-----------------------+----------+--+
|       idx_name        |       tab_name        |       col_names       |           idx_tab_name            |       idx_type        | comment  |
+-----------------------+-----------------------+-----------------------+-----------------------------------+-----------------------+----------+--+
| test_index            | test_hive             | name                  | default__test_hive_test_index__   | compact               |          |
| test_index2           | test_hive             | name                  | default__test_hive_test_index2__  | compact               |          |
+-----------------------+-----------------------+-----------------------+-----------------------------------+-----------------------+----------+--+

修改索引

ALTER INDEX index_name ON table_name [PARTITION partition_spec] REBUILD;

  ALTER INDEX … REBUILD会生成使用WITH DEFERRED REBUILD子句创建的索引,或者重建以前创建的索引。如果指定了分区,则仅重建该分区。

  示例

> ALTER INDEX  test_index ON test_hive REBUILD;

删除索引

DROP INDEX [IF EXISTS] index_name ON table_name;

  示例

> DROP INDEX test_index2 ON test_hive;
> SHOW INDEX ON test_index;
+-----------------------+-----------------------+-----------------------+----------------------------------+-----------------------+----------+--+
|       idx_name        |       tab_name        |       col_names       |           idx_tab_name           |       idx_type        | comment  |
+-----------------------+-----------------------+-----------------------+----------------------------------+-----------------------+----------+--+
| test_index            | test_hive             | name                  | default__test_hive_test_index__  | compact               |          |
+-----------------------+-----------------------+-----------------------+----------------------------------+-----------------------+----------+--+

参考
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Create/Drop/AlterIndex
https://cwiki.apache.org/confluence/display/Hive/IndexDev
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Indexing

<think>我们正在讨论HiveQL的数据定义部分。根据引用内容,HiveQL支持类似SQL的数据定义操作,但有一些特定的扩展和限制。下面我将详细解释HiveQL中数据定义的语法和功能。首先,HiveQL的数据定义主要包括数据库、表的创建、删除和修改等操作。由于Hive的底层基于Hadoop,因此它有一些特定的概念,如外部表、分区、分桶等。###1.数据库操作####创建数据库语法:```sqlCREATEDATABASE[IFNOTEXISTS]database_name[COMMENTdatabase_comment][LOCATIONhdfs_path][WITHDBPROPERTIES(property_name=property_value,...)];```-`IFNOTEXISTS`:可选,如果数据库已存在则不执行操作。-`COMMENT`:数据库的注释。-`LOCATION`:指定数据库在HDFS上的存储路径,如果不指定则使用默认路径。-`WITHDBPROPERTIES`:为数据库设置一些键值对属性。示例(参考引用[3]):```sqlCREATEDATABASEtest2COMMENT"createdatabase";CREATEDATABASEtestWITHDBPROPERTIES('name'='yjt','data'='2019-06-20');```####查看数据库```sqlDESCRIBEDATABASEdatabase_name;--显示数据库基本信息DESCRIBEDATABASEEXTENDEDdatabase_name;--显示数据库的详细信息(包括属性)```示例(引用[3]):```sqlDESCDATABASEtest1;--查看test1数据库的基本信息```####删除数据库```sqlDROPDATABASE[IFEXISTS]database_name[RESTRICT|CASCADE];```-`RESTRICT`:默认,如果数据库非空(含有表)则不允许删除。-`CASCADE`:强制删除数据库及其所有表。###2.表操作####创建表Hive支持两种类型的表:内部表(管理表)和外部表。-**内部表**:由Hive管理其数据和元数据。删除表时,数据也会被删除。-**外部表**:仅管理元数据,数据存储在外部位置(如HDFS)。删除表时,只删除元数据,不删除数据。创建内部表:```sqlCREATETABLE[IFNOTEXISTS]table_name(column_namedata_type[COMMENTcolumn_comment],...)[COMMENTtable_comment][PARTITIONEDBY(col_namedata_type[COMMENTcol_comment],...)]--分区[CLUSTEREDBY(col_name,col_name,...)[SORTEDBY(col_name[ASC|DESC],...)]INTOnum_bucketsBUCKETS]--分桶[ROWFORMATrow_format][STOREDASfile_format][LOCATIONhdfs_path];--如果不指定,将使用默认的数据库路径```创建外部表(引用[4]示例):```sqlCREATEEXTERNALTABLEIFNOTEXISTSstocks(indexINT,sourceINT,destinationINT,costINT)ROWFORMATDELIMITEDFIELDSTERMINATEDBY','LOCATION'/home/hadoop/workspace';```参数说明:-`ROWFORMATDELIMITED`:指定行格式,通常后面跟字段分隔符等。-`FIELDSTERMINATEDBY','`:指定字段分隔符,如逗号。-`STOREDAS`:指定文件存储格式(如TEXTFILE,SEQUENCEFILE,RCFILE等)。-`LOCATION`:指定表数据在HDFS上的存储路径(外部表必须指定,内部表可选)。####分区表分区表可以将数据按某个列的值进行分区存储,提高查询效率。```sqlCREATETABLEtable_name(...)PARTITIONEDBY(partition_col1data_type,...);```注意:分区列不能是表中已定义的列。####查看表信息```sqlDESCRIBE[EXTENDED|FORMATTED]table_name;--查看表结构,EXTENDED或FORMATTED显示更详细信息```####删除表```sqlDROPTABLE[IFEXISTS]table_name;```###3.修改表Hive支持修改表结构,但限制较多(如不能修改列数据类型等)。####修改表名```sqlALTERTABLEold_table_nameRENAMETOnew_table_name;```####修改列```sqlALTERTABLEtable_nameCHANGE[COLUMN]old_col_namenew_col_namedata_type[COMMENTcol_comment][FIRST|AFTERcolumn_name];```####添加列```sqlALTERTABLEtable_nameADDCOLUMNS(new_col_namedata_type[COMMENTcol_comment],...);```####添加分区```sqlALTERTABLEtable_nameADDPARTITION(partition_col=value,...)[LOCATION'location_path'];```###4.其他数据定义操作-视图:Hive支持创建视图,但视图是只读的。-索引Hive早期版本支持索引,但在后续版本中已被弃用(引用[1]提到Hive不支持索引)。###总结HiveQL的数据定义语言(DDL)与SQL类似,但具有一些特定的扩展(如分区、分桶、外部表)和限制(如不支持事务、索引)。这些设计是为了适应Hadoop分布式文件系统的大数据处理特性。§§相关问题§§1.HiveQL中内部表和外部表的主要区别是什么?2.如何创建分区表?分区表有什么优势?3.HiveQL支持哪些数据存储格式?4.HiveQL中如何修改表结构?5.HiveQL的数据库属性(DBPROPERTIES)有什么作用?</think>### HiveQL 数据定义语法与功能详解 HiveQL 的数据定义语言(DDL)用于创建、修改和删除数据库对象(如数据库、表、视图等),其语法与 SQL 类似但存在 Hadoop 生态特有的扩展和限制。以下是核心语法和功能: --- #### **1. 数据库操作** **语法:** ```sql CREATE DATABASE [IF NOT EXISTS] db_name [COMMENT 'description'] [LOCATION 'hdfs_path'] [WITH DBPROPERTIES ('key'='value')]; ``` **功能说明:** - `IF NOT EXISTS`:避免重复创建 - `COMMENT`:添加数据库描述(引用[3]) - `LOCATION`:指定 HDFS 存储路径(默认:`/user/hive/warehouse`) - `WITH DBPROPERTIES`:添加自定义元数据键值对(引用[3]) **示例:** ```sql CREATE DATABASE sales_db COMMENT '销售数据集' WITH DBPROPERTIES ('creator'='admin', 'date'='2023-10-01'); ``` --- #### **2. 表操作** ##### **创建表** **基本语法:** ```sql CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name ( column1 data_type [COMMENT '列注释'], ... ) [COMMENT '表注释'] [PARTITIONED BY (partition_column data_type, ...)] -- 分区 [CLUSTERED BY (column) INTO num_buckets BUCKETS] -- 分桶 [ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'] -- 指定数据格式 [STORED AS file_format] -- 文件格式(TEXTFILE, ORC等) [LOCATION 'hdfs_path'] -- 外部表必须指定(引用[4]) [TBLPROPERTIES ('key'='value')]; ``` **核心功能:** - **`EXTERNAL`**:创建外部表(仅管理元数据,删除表时不删除数据) - **分区(`PARTITIONED BY`)**:将数据按分区列物理分割,加速查询 - **分桶(`CLUSTERED BY`)**:哈希分桶优化 JOIN 和采样 - **数据格式控制**: - `ROW FORMAT`:定义行列分隔符(引用[4]) - `STORED AS`:指定文件格式(默认 TEXTFILE) - **`LOCATION`**:自定义 HDFS 存储路径(对 EXTERNAL 表必需) **示例(外部表):** ```sql CREATE EXTERNAL TABLE IF NOT EXISTS user_logs ( user_id INT, action STRING, timestamp BIGINT ) PARTITIONED BY (dt STRING) -- 按日期分区 ROW FORMAT DELIMITED FIELDS TERMINATED BY '|' LOCATION '/data/user_logs'; -- 引用[4]模式 ``` ##### **修改表** **常用操作:** ```sql -- 添加分区 ALTER TABLE table_name ADD PARTITION (dt='2023-10-01'); -- 重命名表 ALTER TABLE old_name RENAME TO new_name; -- 修改列类型 ALTER TABLE table_name CHANGE COLUMN user_id uid STRING; ``` ##### **删除表** ```sql DROP TABLE [IF EXISTS] table_name; -- 内部表:删除元数据+数据 DROP TABLE external_table_name; -- 外部表:仅删除元数据 ``` --- #### **3. 视图操作** **语法:** ```sql CREATE VIEW view_name AS SELECT ... FROM ... WHERE ...; ``` **限制:** - Hive 视图是逻辑对象(不存储数据) - **不支持物化视图** - 视图查询最终转换为底层表查询 --- #### **4. HiveQL DDL 特性总结** | 功能 | 支持情况 | 说明 | |---------------------|----------------------------------|------------------------------------------| | **数据库/表创建** | ✅ 完整支持 | 含分区、分桶、自定义存储格式 | | **数据更新** | ❌ 不支持 | 无法 UPDATE/DELETE 单行数据(引用[1][2])| | **事务** | ❌ 不支持 | 无 ACID 特性(引用[1]) | | **索引** | ❌ 不支持 | 依赖 HDFS 全表扫描(引用[1]) | | **外部表** | ✅ 完整支持 | 数据与元数据解耦(引用[4]) | | **存储格式扩展** | ✅ 支持 ORC/Parquet 等 | 优化压缩和查询性能 | > **关键限制**:HiveQL DDL 设计目标是大规模**批量数据加载**(非实时更新),因此舍弃了事务和索引,但通过分区/分桶实现了查询优化(引用[1][2])。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值