Hive数据定义语言(DDL)概述
1.什么是DDL语言?
-
数据定义语言 (Data Definition Language, DDL)
- 是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database(schema)、table、view、index等。核心语法由CREATE、ALTER与DROP三个所组成。DDL并不涉及表内部数据的操作。
-
完整建表语法树
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 DELIMITED|SERDE serde_name WITH SERDEPROPERTIES(property_name=property_value,...)] [STORED AS file_format] [LOCATION hdfs_ s_path] [TBLPROPERTIES (property_name=property_value, ...)];
2.Hive数据类型详解
-
整体概述
-
Hive中的数据类型指的是Hive表中的列字段类型。Hive数据类型整体分为两个类别:原生数据类型(primitive data type)和复杂数据类型(complex data type)。
-
原生数据类型包括:数值类型、时间类型、字符串类型、杂项数据类型;
-
复杂数据类型包括:array数组、map映射、struct结构、union联合体。
-
-
-
原生数据类型:

-
复杂数据类型:

-
关于Hive数据类型,需要注意:
- 英文字母大小写不敏感
- 除SQL数据类型外,还支持Java数据类型,比如:string
- int和string是使用最多的,大多数函数都支持
- 复杂数据类型的使用通常需要和分隔符指定语法配合使用
- 如果定义的数据类型和文件不一样,Hive会尝试隐式转换,但是不保证成功
-
数据类型隐式、显示转换:
- 与SQL类似,HQL支持隐式和显式类型转换。 原生类型从窄类型到宽类型的转换称为隐式转换,反之,则不允许
- 下表描述了类型之间允许的隐式转换:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-En9JCSLN-1648214096440)(spark_stu.assets/1648205113962.png)]
3.Hive读写机制
-
What is SerDe?
-
SerDe是Serializer、Deserializer的简称,目的是用于序列化和反序列化。序列化是对象转化为字节码的过程;而反序列化是字节码转换为对象的过程。
-
Hive使用SerDe(和FileFormat)读取和写入行对象。
-

-
需要注意的是,“key”部分在读取会忽略,而在写入时key始终是常数。基本上行对象存储在“value”中
-
Hive读写文件流程
- Hive读取文件机制:首先调用InputFormat(默认TextInputFormat),返回一条一条kv键值对记录(默认是一行对应一条记录)。然后调用SerDe(默认LazySimpleSerDe)的Deserializer,将一条记录中的value根据分隔符切分为各个字段
- Hive写文件机制:将Row写入文件时,首先调用SerDe(默认LazySimpleSerDe)的Serializer将文件转换成字节序列,然后调用OutputFormat将数据写入HDFS文件中
-
Serde相关语法

-
ROW FORMAT是语法关键字,DELIMITED和SERDE二选其一
-
如果使用delimited表示使用默认的LazySimpleSerDe类来处理数据。如果数据文件格式比较特殊可以使用ROW FORMAT SERDE serde_name指定其他的Serde类来处理数据,甚至支持用户自定义SerDe类
-
LazySimpleSerDe分隔符指定
- LazySimpleSerDe是Hive默认的序列化类,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。在建表的时候可以根据数据的特点灵活搭配使用。

- LazySimpleSerDe是Hive默认的序列化类,包含4种子语法,分别用于指定字段之间、集合元素之间、map映射 kv之间、换行的分隔符号。在建表的时候可以根据数据的特点灵活搭配使用。
-
默认分隔符:’\001’,是一种特殊的字符,使用的是ascii编码的值,键盘是打不出来的
-
4.Hive的内、外部表概述
-
什么是内部表?
- **内部表(Internal table)**也称为被Hive拥有和管理的托管表(Managed table)。默认情况下创建的表就是内部表,Hive拥有该表的结构和文件。换句话说,Hive完全管理表(元数据和数据)的生命周期,类似于RDBMS中的表。
- 当您删除内部表时,它会删除数据以及表的元数据。
- 可以使用DESCRIBE FORMATTED 表名 ;来获取表的描述信息
-
什么是外部表?
- **外部表(External table)**中的数据不是Hive拥有或管理的,只管理表元数据的生命周期。要创建一个外部表,需要使用EXTERNAL语法关键字。
- 删除外部表只会删除元数据,而不会删除实际数据。在Hive外部仍然可以访问实际数据。
- 而且外部表更为方便的是可以搭配location语法指定数据的路径。
-
内部表和外部表有什么区别?
-
无论内部表还是外部表,Hive都在Hive Metastore中管理表定义及其分区信息
-
删除内部表会从Metastore中删除表元数据,还会从HDFS中删除其所有数据/文件
-
删除外部表,只会从Metastore中删除表的元数据,并保持HDFS位置中的实际数据不变

-
如何选择内部表和外部表?
- 当需要通过Hive完全管理控制表的整个生命周期时,请使用内部表。
- 当文件已经存在或位于远程位置时,请使用外部表,因为即使删除表,文件也会被保留
-
5.分区表概述
-
什么是分区表?
- 分区表指的是:根据用户指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段
- 分区的概念提供了一种将Hive表数据分离为多个文件/目录的方法。不同分区对应着不同的文件夹,同一分区的数据存储在同一个文件夹下。只需要根据分区值找到对应的文件夹,扫描本分区下的文件即可,避免全表数据扫描。
-
分区表建表语法:
CREATE TABLE table_name (column1 data_type, column2 data_type) PARTITIONED BY (partition1 data_type, partition2 data_type,….);- 注意:分区字段不能是表中已经存在的字段,因为分区字段最终也会以虚拟字段的形式显示在表结构上。
- 可以构建多重分区表:多重分区下,分区之间是一种递进关系,可以理解为在前一个分区的基础上继续分区。从HDFS的角度来看就是文件夹下继续划分子文件夹。
-
分区表数据加载——静态分区
-
所谓静态分区指的是分区的字段值是由用户在加载数据的时候手动指定的
-
语法:
load data [local] inpath ' ' into table tablename partition (分区字段='分区值'...);
-
-
分区表数据加载——动态分区
-
所谓动态分区指的是分区的字段值是基于查询结果自动推断出来的。核心语法就是insert+select
-
启动Hive动态分区,需要在Hive回话中设置两个参数
set hive.exec.dynamic.partition
-

本文详细介绍了Hive的数据定义语言(DDL),包括DDL的用途、Hive的数据类型、读写机制、内/外部表、分区表、分桶表、事务表、视图以及物化视图等概念。特别强调了内部表和外部表的区别,以及分区表在数据管理和查询优化中的作用。此外,还涵盖了Hive的其他DDL操作,如数据库和表的管理。
最低0.47元/天 解锁文章
868

被折叠的 条评论
为什么被折叠?



