Skip to content

DDL数据定义

1. 数据库(database)

1.1 创建数据库

  1. 语法
sh
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, ...)];
  1. 创建一个数据库,不指定路径 Alt text
  2. 创建一个数据库,指定路径 Alt text 查看运行效果:
    Alt text
  3. 创建一个数据库,带有dbproperties Alt text

1.2 查询数据库

  1. 语法:
sh
SHOW DATABASES [LIKE 'identifier_with_wildcards'];

提示

like通配表达式说明:%表示任意个任意字符,和MySQL的Like类似。

  1. 展示所有数据库 Alt text

1.3 查看数据库信息

  1. 语法
sh
DESCRIBE | DESC  DATABASE [EXTENDED] db_name;
  1. 查看简要信息
    Alt text
  2. 查看详细信息 Alt text

1.4 修改数据库

用户可以使用alter database命令修改数据库某些信息,其中能够修改的信息包括dbproperties、location、owner user。需要注意的是:修改数据库location,不会改变当前已有表的路径信息,而只是改变后续创建的新表的默认的父目录。

  1. 语法
sh
--修改dbproperties
ALTER DATABASE database_name SET DBPROPERTIES (property_name=property_value, ...);
--修改location
ALTER DATABASE database_name SET LOCATION hdfs_path;
--修改owner user
ALTER DATABASE database_name SET OWNER USER user_name;
  1. 修改dbproperties Alt text

1.5 删除数据库

  1. 语法
sh
DROP DATABASE [IF EXISTS] database_name [RESTRICT|CASCADE];

提示

  • RESTRICT:严格模式,若数据库不为空,则会删除失败,默认为该模式。
  • CASCADE:级联模式,若数据库不为空,则会将库中的表一并删除。

1.6 切换当前数据库

  1. 语法: USE database_name;
  2. 切换当前到db_hive1数据库 Alt text

2. 表(table)

查看表的建表语句:
Alt text

2.1 普通建表

  1. 完整语法
sh
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]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]
[TBLPROPERTIES (property_name=property_value, ...)]
  1. 关键字说明:
  • TEMPORARY: 临时表,该表只在当前会话可见,会话结束,表会被删除。
  • EXTERNAL: 外部表,与之相对应的是内部表(管理表)。管理表意味着Hive会完全接管该表,包括元数据和HDFS中的数据。而外部表则意味着Hive只接管元数据,而不完全接管HDFS中的数据。
  • data_type: Hive中的字段类型可分为基本数据类型和复杂数据类型。
  • PARTITIONED BY: 创建分区表
  • CLUSTERED BY ... SORTED BY...INTO ... BUCKETS: 创建分桶表
  • ROW FORMAT: 指定SERDESERDE是Serializer and Deserializer的简写。Hive使用SERDE序列化和反序列化每行数据。Hive的读写详情可参考 Hive-Serde。语法说明如下:
    语法一:DELIMITED关键字表示对文件中的每个字段按照特定分割符进行分割,其会使用默认的SERDE对每行数据进行序列化和反序列化。
    sh
    ROW FORAMT DELIMITED 
    [FIELDS TERMINATED BY char] 
    [COLLECTION ITEMS TERMINATED BY char] 
    [MAP KEYS TERMINATED BY char] 
    [LINES TERMINATED BY char] 
    [NULL DEFINED AS char]
    其中:
    fields terminated by:列分隔符
    collection items terminated by: map、struct和array中每个元素之间的分隔符
    map keys terminated by:map中的key与value的分隔符
    lines terminated by:行分隔符
    语法二:SERDE关键字可用于指定其他内置的SERDE或者用户自定义的SERDE。例如JSON SERDE,可用于处理JSON字符串。
    sh
    ROW FORMAT SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,property_name=property_value, ...)]
  • STORED AS: 指定文件格式,常用的文件格式有,textfile(默认值),sequence file,orc file、parquet file等等。
  • LOCATION: 指定表所对应的HDFS路径,若不指定路径,其默认值为${hive.metastore.warehouse.dir}/db_name.db/table_name
  • TBLPROPERTIES: 用于配置表的一些KV键值对参数。
  1. 建表实操
    若现有如下格式的JSON文件需要由Hive进行分析处理,请考虑如何设计表? 注:以下内容为格式化之后的结果,文件中每行数据为一个完整的JSON字符串。
json
{
    "name": "dasongsong",
    "friends": [
        "bingbing",
        "lili"
    ],
    "students": {
        "xiaohaihai": 18,
        "xiaoyangyang": 16
    },
    "address": {
        "street": "hui long guan",
        "city": "beijing",
        "postal_code": 10010
    }
}

我们可以考虑使用专门负责JSON文件的JSON Serde,设计表字段时,表的字段与JSON字符串中的一级字段保持一致,对于具有嵌套结构的JSON字符串,考虑使用合适复杂数据类型保存其内容。最终设计出的表结构如下:

sql
CREATE TABLE IF NOT EXISTS teacher(
name string,
friends ARRAY<string>,
students MAP<string, int>,
address struct<street:string,city:string, postal_code:int>
)
ROW format serde 'org.apache.hadoop.hive.serde2.JsonSerDe'
location '/user/hive/warehouse/teacher';

创建该表,并准备以下数据文件。注意,需要确保文件中每行数据都是一个完整的JSON字符串,JSON SERDE才能正确的处理。

sh
[jack@hadoop102 ~]$ cat /tmp/hive/datas/teacher.txt
{"name":"dasongsong1","friends":["bingbing","lili"],"students":{"xiaohaihai":18,"xiaoyangyang":16},"address":{"street":"hui long guan","city":"beijing","postal_code":10010}}
{"name":"dasongsong2","friends":["bingbing","lili"],"students":{"xiaohaihai":18,"xiaoyangyang":16},"address":{"street":"hui long guan","city":"beijing","postal_code":10010}}
{"name":"dasongsong3","friends":["bingbing","lili"],"students":{"xiaohaihai":18,"xiaoyangyang":16},"address":{"street":"hui long guan","city":"beijing","postal_code":10010}}

上传文件到Hive表指定的路径

sh
[jack@hadoop102 ~]$ hadoop fs -put  /tmp/hive/datas/teacher.txt /user/hive/warehouse/teacher

尝试从复杂数据类型的字段中取值 Alt text

2.2 (CTAS)建表

(CTAS)指的是Create Table As Select,该语法允许用户利用select查询语句返回的结果,直接建表,表的结构和查询语句的结构保持一致,且保证包含select查询语句放回的内容。

  1. 语法
sh
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] table_name 
[COMMENT table_comment] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]

可以看出CTAS建表方式不支持创建外部表。

sql
create table teacher1 as select * from teacher;

查看数据是否包含 Alt text

2.3 (CTL)建表

(CTL)指的是Create Table Like,该语法允许用户复刻一张已经存在的表结构,与上述的CTAS语法不同,该语法创建出来的表中不包含数据。

  1. 语法
sh
CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
[LIKE exist_table_name]
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]

(CTL)建表方式建表由于不包含数据,比(CTAS)建表方式快。

sql
create table teacher2 like teacher;

建表后查看数据 Alt text

2.4. 查看表

  1. 语法
sql
SHOW TABLES [IN database_name] LIKE ['identifier_with_wildcards'];

比如查询tea开头的表 Alt text 查看指定数据库的表 Alt text

2.5 查看表信息

  1. 语法
sql
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name

其中关键字说明:

  • EXTENDED:展示详细信息
  • FORMATTED:对详细信息进行格式化的展示
    比如查看teacher表的详细信息 Alt text 查看stu表的详细信息格式化展示 Alt text 可以看出FORMATTED就是将字段Detailed Table Information信息格式化

2.6 重命名表

  1. 重命名表
    语法:ALTER TABLE table_name RENAME TO new_table_name

2.7 修改列信息

  1. 增加列
    该语句允许用户增加新的列,新增列的位置位于末尾。
sql
ALTER TABLE table_name ADD COLUMNS (col_name data_type [COMMENT col_comment], ...)

比如stu表添加sex字段

sql
ALTER TABLE stu ADD columns (sex string);
  1. 更新列
    该语句允许用户修改指定列的列名、数据类型、注释信息以及在表中的位置。
    需要注意的是涉及修改列顺序Hive只是更改表的列信息信息,Hive不会去变更数据文件的每行数据位置,这使得查询数据显示会发生错乱。比如查询的第一个字段调整到最后一个,但结果集数据不会变化,第一列的数据不会动态显示到最后。
sql
ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

比如stu表sex字段改为gender并设置类型为int Alt text 报错是因为Hive会自动提前检查类型转换是否合适,提示string转换int类型转换不成功,可以关闭Hive检查功能。

sql
-- 临时设置关闭自动类型转换检测
SET  hive.metastore.disallow.incompatible.col.type.changes=FALSE;
ALTER TABLE stu CHANGE sex gender int after id;

查看表结构 Alt text 3. 替换列
该语句允许用户用新的列集替换表中原有的全部列。

sql
ALTER TABLE table_name REPLACE COLUMNS (col_name data_type [COMMENT col_comment], ...)

比如删除stu表gender字段 Alt text

2.8 删除表

  1. 语法: DROP TABLE [IF EXISTS] table_name;

2.9 清空表

  1. 语法: TRUNCATE [TABLE] table_name

提示

truncate只能清空管理表,不能删除外部表中数据。

3. Hive数据类型

基本数据类型如下:

数据类型说明
tinyint1byte 有符号整数
smallint2byte 有符号整数
int4byte 有符号整数
bigint8byte 有符号整数
boolean布尔类型,true或者false
float单精度浮点数
double双精度浮点数
decimal十进制精准数字类型
varchar字符序列,需指定最大长度,最大长度的范围是[1,65535]
string字符串,无需指定最大长度
timestamp时间类型
binary二进制数据

复杂数据类型如下;

类型说明定义取值
array数组是一组相同类型
的值的集合
array<string>arr[0]
mapmap是一组相同类型
的键-值对集合
map<string, int>map['key']
struct结构体由多个属性组成,
每个属性都有自己的属性名和数据类型
struct<id:int, name:string>struct.id

Hive的基本数据类型可以做类型转换,转换的方式包括隐式转换以及显示转换。

  1. 隐式转换
    具体规则如下:
    a. 任何整数类型都可以隐式地转换为一个范围更广的类型,如tinyint可以转换成int,int可以转换成bigint。
    b. 所有整数类型、float和string类型都可以隐式地转换成double。
    c. tinyint、smallint、int都可以转换为float。
    d. boolean类型不可以转换为任何其它的类型。
    详情可参考Hive官方说明:Allowed Implicit Conversions
    隐式转换举例:
    Alt text
  2. 显示转换
    可以借助cast函数完成显示的类型转换。
    语法: cast(expr as <type>)

4. 内部表与外部表

4.1 内部表

Hive中默认创建的表都是的内部表,有时也被称为管理表。对于内部表,Hive会完全管理表的元数据和数据文件。在多人协作时,都是创建的外部表。
创建内部表student:

sql
CREATE TABLE IF NOT EXISTS student(
id int,
name string
)
ROW format delimited fields terminated BY '\t'
location '/user/hive/warehouse/student';

准备其需要的数据文件如下,注意字段之间的分隔符\t。

sh
[jack@hadoop102 ~]$ vi /tmp/hive/datas/student.txt
1001	student1
1002	student2
1003	student3
1004	student4
1005	student5
1006	student6
1007	student7
1008	student8
1009	student9
1010	student10
1011	student11
1012	student12
1013	student13
1014	student14
1015	student15
1016	student16

上传文件到student表指定的路径

sh
[jack@hadoop102 ~]$ hadoop fs -put  /tmp/hive/datas/student.txt /user/hive/warehouse/student

查询数据:
Alt text 删除表,观察数据HDFS中的数据文件是否还在 Alt text 发现hdfs上面student文件已经不存在 Alt text

4.2 外部表

外部表通常可用于处理其他工具上传的数据文件,对于外部表,Hive只负责管理元数据,不负责管理HDFS中的数据文件。

sql
create external table if not exists student(
    id int, 
    name string
)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student';

再次上传数据文件到student表指定的路径

sh
[jack@hadoop102 ~]$ hadoop fs -put  /tmp/hive/datas/student.txt /user/hive/warehouse/student

删除表,观察数据HDFS中的数据文件是否还在 Alt text