1.4.3.5 Hive的DDL操作

2020-04-07  本文已影响0人  寒暄_HX

总目录:https://www.jianshu.com/p/e406a9bc93a9

Hadoop - 子目录:https://www.jianshu.com/p/9428e443b7fd

什么是DDL

DDL--数据定义语言,用来定义存储数据的概念,例如库,表等。

数据库的增删改查

如果要在建库时判断是否重名就要加if not exists

示例

同时也可以指定库存在的位置:
create database 库名 location '绝对路径';

示例
hdfs

建表语句

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[COMMENT table_comment]
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
[CLUSTERED BY (col_name, col_name, ...)
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]

(1)CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出
异常;用户可以用 IF NOT EXISTS 选项来忽略这个异常。
(2)EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际
数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路
径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的
时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。
(3)COMMENT:为表和列添加注释。
(4)PARTITIONED BY 创建分区表
(5)CLUSTERED BY 创建分桶表 (6)SORTED BY 不常用
(7)ROW FORMAT
DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]
 [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char] 
 | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, ...)]
用户在建表的时候可以自定义 SerDe 或者使用自带的 SerDe。如果没有指定 ROW 
FORMAT 或者 ROW FORMAT DELIMITED,将会使用自带的 SerDe。在建表的时候,用户
还需要为表指定列,用户在指定表的列的同时也会指定自定义的 SerDe,Hive 通过 SerDe
确定表的具体的列的数据。
SerDe 是 Serialize/Deserilize 的简称,目的是用于序列化和反序列化。
(8)STORED AS 指定存储文件类型
常用的存储文件类型:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)
如果文件数据是纯文本,可以使用 STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE。 
(9)LOCATION :指定表在 HDFS 上的存储位置。
(10)LIKE 允许用户复制现有的表结构,但是不复制数据。

内外部表

将内部表转换为外部表
alter table 表名 set tblproperties('EXTERNAL'='TRUE');

示例
('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,必须大写。

分区表

分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所有的数据文件。
Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据集。
在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率会提高很多。

分区表的简单实用

创建一个分区表


创建表

指定分区字段,然后导入数据时按照分区字段来分。


导入数据
查看表数据。
示例

查看hdfs上的数据。


hdfs
类型是d,表示他们是目录。而三个目录的名字是他们各自的分区。
在数据库中的元数据。
元数据
数据库中存放了三条记录,他们对应的表ID相同,但是分区ID不同。
分区表的基础操作
分区表的注意事项
查询语法

方式一:上传数据后修复
上传数据

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202004/day=03;
hive (default)> dfs -put /usr/hive_data/dept.txt /user/hive/warehouse/dept_partition2/month=202004/day=03;

查询数据(查询不到刚上传的数据)

hive (default)> select * from dept_partition2 where month='202004' and day='03';

执行修复命令

hive (default)> msck repair table dept_partition2;

再次查询数据

hive (default)> select * from dept_partition2 where month='202004' and day='03';

方式二:上传数据后添加分区
上传数据

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202004/day=02;
hive (default)> dfs -put /usr/hive_data/dept.txt /user/hive/warehouse/dept_partition2/month=202004/day=02;

执行添加分区

hive (default)> alter table dept_partition2 add partition(month='202004',day='02');

查询数据

hive (default)> select * from dept_partition2 where month='202004' and day='02';

方式三:创建文件夹后 load 数据到分区
创建目录

hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=202004/day=01;

上传数据

hive (default)> load data local inpath '/usr/hive_data/dept.txt' into table dept_partition2 partition(month='202004',day='01');

查询数据

hive (default)> select * from dept_partition2 where month='202004' and day='01';

表的修改

重命名表

alter table 旧表名 rename to 新表名

示例

修改表结构

表的删除

drop table 表名;

删除
上一篇 下一篇

猜你喜欢

热点阅读