一、概述
Hive是建立在Hadoop上的数据仓库工具,它允许用户通过类SQL的语法来查询和管理数据。在Hive中,DDL(数据定义语言)和视图操作是非常常见的。
1)表和视图关系
表和视图都是数据存储的逻辑表示方式。它们之间有以下关系:
- 视图可以基于一个或多个表创建,而表不可以基于其他表或视图创建。因此,视图是从一个或多个表的查询结果中获取数据的虚拟表,而表是实际存储数据的物理表。
- 视图通常用于简化查询或隐藏数据的复杂性,可以对基础表进行查询过滤、聚合或连接等操作,从而提供更易于理解的结果。而表则是实际存储和管理数据的物理存储单元。
- 视图在定义时不会实际创建物理表,而是保存了一系列查询语句。在查询视图时,Hive会执行这些查询语句并返回结果。而表则是在定义时就创建了物理存储单元,并在其中存储了数据。
- 视图可以简化数据访问,因为它可以隐藏底层表的复杂性和细节,让用户能够更容易地对数据进行操作和分析。而表可以提供更加灵活和高效的数据存储和访问方式,因为它们直接存储数据并允许对数据进行更广泛的操作和管理。
总之,表和视图都是数据存储和管理的方式,它们有各自的优点和适用场景。在Hive中,用户可以根据实际需要选择使用表还是视图来满足不同的数据访问和管理需求。
2)表与视图的区别
在Hive中,表和视图也是数据存储的逻辑表示方式,但它们之间存在以下区别:
- 存储方式:表是实际存储数据的物理表格,而视图不是存储数据的实体,而是基于查询结果生成的虚拟表格。
- 数据管理:表可以直接存储和管理数据,而视图只是从一个或多个表的查询结果中生成的,它并不实际存储数据。因此,对于大量数据的存储和管理,使用表更为合适;而对于简化查询或隐藏数据的复杂性,使用视图更为合适。
- 数据修改:对于表,用户可以随时对其中的数据进行修改、插入或删除等操作。而对于视图,用户只能对其进行查询,无法对其进行数据修改操作。
- 查询效率:由于视图仅仅是基于查询语句生成的虚拟表格,因此查询视图时的效率比查询表要低。尤其是当视图基于多个表时,查询效率会更低。
总之,在Hive中,表和视图都有各自的优点和适用场景。用户可以根据实际需求选择使用哪种方式来存储和管理数据,以及在查询数据时使用哪种方式来提高效率和简化操作。
二、环境准备
如果已经有了环境了,可以忽略,如果想快速部署环境可以参考我这篇文章:通过 docker-compose 快速部署 Hive 详细教程
三、Hive 数据类型
Hive支持原始数据类型和复杂类型,原始类型包括数值型,Boolean,字符串,时间戳。复杂类型包括数组,map,struct。
下面是Hive数据类型汇总:
四、DDL 操作
1)表的基本语法
在Hive中,你可以使用HiveQL语言来创建表。下面是一些创建表的基本语法:
其中,[] 表示可选项,...表示省略的内容。
以下是一些常见的参数解释:
- TEMPORARY:表示创建一个临时表。临时表在会话结束时自动删除。
- EXTERNAL:表示创建一个外部表。外部表的数据不是存储在Hive的数据仓库中,而是存储在Hadoop分布式文件系统中。
- IF NOT EXISTS:表示如果表已经存在,则不执行创建表操作。
- table_name:表示表的名称。
- col_name:表示列的名称。
- data_type:表示列的数据类型。
- column_constraint_specification:表示列的约束条件,比如 NOT NULL、UNIQUE等。
- COMMENT:表示列或表的注释。
- PARTITIONED BY:表示表的分区列。
- CLUSTERED BY:表示表的分桶列。
- SORTED BY:表示分桶列的排序方式。
- num_buckets:表示分桶的数量。
- SKEWED BY:表示表的倾斜列。
- STORED AS:表示表的存储格式,比如TEXTFILE、SEQUENCEFILE等。
- TBLPROPERTIES :指定压缩方式,默认情况下,Hive不会对文件进行压缩。有以下几种压缩方式:
- LOCATION:表示表的数据存储路径。只有外部表才能使用 LOCATION 关键字来指定存储路径。
关于分区和分桶的介绍可以参考我这篇文章:【大数据】Hive 分区和分桶的区别及示例讲解
2)列分隔符和行分隔符
在Hive中,ROW FORMAT DELIMITED 是用于指定表中数据的列分隔符和行分隔符的关键字,默认的列分隔符是制表符(Tab键),默认的行分隔符是换行符(\n)。
通过指定这些分隔符,用户可以将不同格式的数据导入到Hive表中,并在查询表时正确地解析数据。使用 ROW FORMAT DELIMITED,用户可以指定以下参数:
- FIELDS TERMINATED BY: 用于指定列分隔符。默认情况下,Hive使用制表符作为列分隔符。用户可以使用该选项指定自定义的列分隔符,例如逗号、竖线等。
- ESCAPED BY: 用于指定转义字符。如果数据中包含列分隔符或行分隔符,则可以使用该选项指定转义字符,以确保这些字符被正确解析。
- LINES TERMINATED BY: 用于指定行分隔符。默认情况下,Hive使用换行符作为行分隔符。用户可以使用该选项指定自定义的行分隔符,例如换行符、回车符等。
例如,以下是使用 ROW FORMAT DELIMITED 指定逗号作为列分隔符和换行符作为行分隔符来创建一个Hive表的示例:
3)添加表数据方式
1、INSERT 方式
在Hive中,可以使用 INSERT 语句来向表中添加数据。Hive支持多种数据来源和格式,包括文本文件、CSV文件、JSON文件等。内部表(管理表)的数据只能通过 INSERT INTO 命令进行插入,而不能直接修改原始数据。普通表在被删除时,会将表中的数据一并删除。
以下是使用 INSERT 语句向Hive表中添加数据的基本语法:
- 其中,tablename是要添加数据的表的名称,
- partition_column是要添加数据的表的分区列名称,
- partition_value是要添加数据的表的分区列值,
- row_format是用于指定输入数据格式的关键字,
- file_format是用于指定输出数据格式的关键字,
- SELECT ...是用于指定要添加到表中的数据的查询语句。
下面是向一个Hive表中添加数据的示例:
假设有一个Hive表mytable,其中包含四个字段:id、name、age和gender,用户可以使用以下命令向该表中添加数据:
该命令将向mytable表中插入三行数据,每行数据包含四个字段。
用户也可以从其他表或查询结果中插入数据。例如,以下命令从另一个表yourtable中选择一些数据插入到mytable中:
该命令将从yourtable表中选择年龄大于25的数据,并将其插入到mytable表中。
【注意】向Hive表中添加数据时,数据格式和分隔符需要与表定义中的一致,否则会导致数据无法正确解析。可以使用 ROW FORMAT 和FIELDS TERMINATED BY等关键字来指定数据格式和分隔符。
2、LOAD DATA方式
使用LOAD DATA语句可以将本地或HDFS上的数据加载到Hive表中。具体语法和示例请见下面的示例:
- 其中,filepath是要加载的数据文件路径,
- tablename是要加载数据的表的名称,
- partition_column是要加载数据的表的分区列名称,
- partition_value是要加载数据的表的分区列值,
- row_format是用于指定输入数据格式的关键字,
- field_delim是用于指定字段分隔符的字符,
- line_delim是用于指定行分隔符的字符,
- file_format是用于指定输出数据格式的关键字。
【注意】
- 如果使用了 LOCAL 关键字,则表示从本地文件系统加载数据,否则从HDFS加载数据。
- 如果使用了 OVERWRITE 关键字,则表示将数据加载到表中时会覆盖原有数据。
例如,以下命令从本地文件系统加载数据文件到一个Hive表中:
3、外部表方式
在Hive中,可以创建外部表,这样可以将数据存储在HDFS或本地文件系统中,并且不会影响到原始数据文件。
- 创建外部表:使用 CREATE EXTERNAL TABLE 语句创建外部表,同时指定外部表的表结构和数据存储位置。例如:
其中,mytable 是外部表的名称,col1 和 col2 是表的两个列,ROW FORMAT 和 FIELDS TERMINATED BY 关键字指定了数据格式和分隔符,LOCATION 关键字指定了数据存储位置,可以是HDFS或本地文件系统路径。
- 将数据文件复制到指定位置:将数据文件复制到指定的数据存储位置,例如将数据文件复制到'/path/to/datafile'目录下。
- 查询数据:使用 SELECT 语句查询数据。Hive会自动读取外部表的数据文件并将其解析为表格数据,然后返回查询结果。例如:
【注意】:
- 创建外部表时,表结构和数据存储位置需要与实际数据文件一致,否则查询结果可能会不正确。
- 同时,使用外部表方式导入数据时,Hive不会移动或修改数据文件,因此需要手动将数据文件复制到指定位置,并保证数据文件的完整性。
需要注意的是,向Hive表中添加数据时,数据格式和分隔符需要与表定义中的一致,否则会导致数据无法正确解析。可以使用 ROW FORMAT 和FIELDS TERMINATED BY等关键字来指定数据格式和分隔符。
4)DDL 常见操作
1、创建表
使用 CREATE TABLE 语句来创建表。
语法:
示例:
2、修改表
使用 ALTER TABLE 语句来修改表结构。
语法:
示例:
3、删除表
使用 DROP TABLE 语句来删除表。
语法:
示例:
4、创建分区表
用 CREATE TABLE ... PARTITIONED BY 语句来创建分区表。
语法:
示例:
5、创建外部表
用 CREATE EXTERNAL TABLE 语句来创建外部表。
语法:
示例:
五、视图操作
1)创建视图
用 CREATE VIEW 语句来创建视图。
语法:
示例:
2)修改视图
用 ALTER VIEW 语句来修改视图。
语法:
示例:
3)删除视图
用 DROP VIEW 语句来修改视图。
语法:
示例:
4)查看视图定义
用 DESCRIBE VIEW 语句来查看视图定义。
语法:
示例:
总之,Hive中的DDL操作和视图操作可以帮助用户定义和管理表、视图等数据结构,从而更加灵活和高效地管理和查询数据。用户可以根据实际需求选择使用哪种操作方式,以达到更好的数据管理和操作效果。