HiveQL DDL—视图

本文详细介绍了Hive中视图的创建、查看、修改及删除等操作,解析了视图作为逻辑数据结构如何简化复杂查询,同时提供了具体示例,帮助读者掌握视图的管理和维护。

概述

  视图是一个纯粹的逻辑数据结构,通过隐藏复杂度(如joins, subqueries, filters)来简化查询。之所以说视图是一种逻辑结果,是因为视图只有元数据信息,不会关联HDFS中的任何存储,也就是不存储任何实际数据。视图一旦被创建,它的schema信息就会被冻结,如果视图底层关联的表的结构发生了变化(比如增加了字段),并不会反射到视图中。如果底层关联的表被删除或发生了变化,那么对视图的查询操作将会失败。另外,视图是只读的,不能使用LOAD/INSERT/ALTER语句将数据插入其中。

创建视图

CREATE VIEW [IF NOT EXISTS] [db_name.]view_name [(column_name [COMMENT column_comment], ...) ]
  [COMMENT view_comment]
  [TBLPROPERTIES (property_name = property_value, ...)]
  AS SELECT ...;

  CREATE VIEW语句可以创建指定名称的视图。创建时,如果没有提供字段名,将会从SELECT表达式自动衍生。如果SELECT中包含了未指定别名的数据表达式,如 x + y。那么视图将按照_C0, _C1这样的格式生成字段名。

  示例
  说明:创建视图不会触发yarn作业,因为这仅仅会修改hive的元数据信息。但是,当查询视图的时候可能会触发yarn作业。

> CREATE VIEW IF NOT EXISTS employee_view_skills
AS
SELECT
name, skills_score['DB'] as DB,
skills_score['Perl'] as Perl,
skills_score['Python'] as Python,
skills_score['Sales'] as Sales,
skills_score['HR'] as HR
FROM employee_internal;

  从Hive2.2.0以后,可以使用SHOW VIEWS语句查看数据库中的视图。之前的版本可以使用 SHOW TABLES 语句查看:

> SHOW VIEWS;
+-----------------------+
|       tab_name        |
+-----------------------+
| employee_view_skills  |
+-----------------------+

查看视图

  和表一样,可以使用DESC ,SHOW CREATE TABLE语句查看视图的信息。

  示例

> SHOW CREATE TABLE employee_view_skills;
+----------------------------------------------------+
|                   createtab_stmt                   |
+----------------------------------------------------+
| CREATE VIEW `employee_view_skills` AS SELECT       |
| `employee_internal`.`name`, `employee_internal`.`skills_score`['DB'] as `DB`, |
| `employee_internal`.`skills_score`['Perl'] as `Perl`, |
| `employee_internal`.`skills_score`['Python'] as `Python`, |
| `employee_internal`.`skills_score`['Sales'] as `Sales`, |
| `employee_internal`.`skills_score`['HR'] as `HR`   |
| FROM `test2`.`employee_internal`                   |
+----------------------------------------------------+

> DESC FORMATTED employee_view_skills;
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
|           col_name            |                     data_type                      |                      comment                       |
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
| # col_name                    | data_type                                          | comment                                            |
| name                          | string                                             |                                                    |
| db                            | int                                                |                                                    |
| perl                          | int                                                |                                                    |
| python                        | int                                                |                                                    |
| sales                         | int                                                |                                                    |
| hr                            | int                                                |                                                    |
|                               | NULL                                               | NULL                                               |
| # Detailed Table Information  | NULL                                               | NULL                                               |
| Database:                     | test2                                              | NULL                                               |
| OwnerType:                    | USER                                               | NULL                                               |
| Owner:                        | hadoop                                             | NULL                                               |
| CreateTime:                   | Fri Sep 27 18:16:27 CST 2019                       | NULL                                               |
| LastAccessTime:               | UNKNOWN                                            | NULL                                               |
| Retention:                    | 0                                                  | NULL                                               |
| Table Type:                   | VIRTUAL_VIEW                                       | NULL                                               |
| Table Parameters:             | NULL                                               | NULL                                               |
|                               | bucketing_version                                  | 2                                                  |
|                               | transient_lastDdlTime                              | 1569579387                                         |
|                               | NULL                                               | NULL                                               |
| # Storage Information         | NULL                                               | NULL                                               |
| SerDe Library:                | null                                               | NULL                                               |
| InputFormat:                  | org.apache.hadoop.mapred.TextInputFormat           | NULL                                               |
| OutputFormat:                 | org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat | NULL                                               |
| Compressed:                   | No                                                 | NULL                                               |
| Num Buckets:                  | -1                                                 | NULL                                               |
| Bucket Columns:               | []                                                 | NULL                                               |
| Sort Columns:                 | []                                                 | NULL                                               |
|                               | NULL                                               | NULL                                               |
| # View Information            | NULL                                               | NULL                                               |
| Original Query:               | SELECT                                             | NULL                                               |
|                               |                                                    | name, skills_score['DB'] as DB,                    |
|                               |                                                    | skills_score['Perl'] as Perl,                      |
|                               |                                                    | skills_score['Python'] as Python,                  |
|                               |                                                    | skills_score['Sales'] as Sales,                    |
|                               |                                                    | skills_score['HR'] as HR                           |
|                               |                                                    | FROM employee_internal                             |
| Expanded Query:               | SELECT                                             | NULL                                               |
|                               |                                                    | `employee_internal`.`name`, `employee_internal`.`skills_score`['DB'] as `DB`, |
|                               |                                                    | `employee_internal`.`skills_score`['Perl'] as `Perl`, |
|                               |                                                    | `employee_internal`.`skills_score`['Python'] as `Python`, |
|                               |                                                    | `employee_internal`.`skills_score`['Sales'] as `Sales`, |
|                               |                                                    | `employee_internal`.`skills_score`['HR'] as `HR`   |
|                               |                                                    | FROM `test2`.`employee_internal`                   |
+-------------------------------+----------------------------------------------------+----------------------------------------------------+

修改视图

  使用ALTER VIEW语句可以修改视图。

修改视图的属性

ALTER VIEW [db_name.]view_name SET TBLPROPERTIES table_properties;
 
table_properties:
  : (property_name = property_value, property_name = property_value, ...)

  示例:修改注释

> ALTER VIEW employee_view_skills SET TBLPROPERTIES ('comment'='This is a view');
> DESC FORMATTED employee_view_skills;
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
|           col_name            |                     data_type                      |                      comment                       |
+-------------------------------+----------------------------------------------------+----------------------------------------------------+
...
| Table Parameters:             | NULL                                               | NULL                                               |
|                               | bucketing_version                                  | 2                                                  |
|                               | comment                                            | This is a view                                     |
...
+-------------------------------+----------------------------------------------------+----------------------------------------------------+

重定义视图

ALTER VIEW [db_name.]view_name AS select_statement;

  使用Alter View As Select语句可以修改视图的定义,修改的视图必须是已经存在的。

  示例:

> ALTER VIEW employee_view_skills as SELECT * from employee_internal;
> desc employee_view_skills;
+---------------+--------------------------------+----------+
|   col_name    |           data_type            | comment  |
+---------------+--------------------------------+----------+
| name          | string                         |          |
| work_place    | array<string>                  |          |
| gender_age    | struct<gender:string,age:int>  |          |
| skills_score  | map<string,int>                |          |
| depart_title  | map<string,array<string>>      |          |
+---------------+--------------------------------+----------+

删除视图

DROP VIEW [IF EXISTS] [db_name.]view_name;

  说明:如果一个视图引用了另一个视图,那么被引用的视图被删除时不会抛出异常信息,引用视图会变得不可用。

  示例

> DROP VIEW employee_view_skills;
> SHOW views;
+-----------+
| tab_name  |
+-----------+
+-----------+

参考
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL
书籍 Apache Hive Essentials Second Edition (by Dayong Du) Chapter 3

<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、付费专栏及课程。

余额充值