Hive数据类型和文件格式
Hive 支持关系数据库中的大多数基本的数据类型,同时也支持在关系数据库中很少出现的三种 数据集合 类型。
和大多数数据库相比,Hive具有一个独特的功能,就是对数据在文件中的编码方式具有相当大的灵活性,大多数据库对数据具有完全控制,也包括
对数据什么周期的控制,Hive将这些方面的控制权交给用户,以便更加容易的使用各种各样的工具来管理和处理数据。
基本数据类型
类型 | 描述 | 示例 |
---|---|---|
TINYINT | 1个字节8位有符号整数 | 1 |
SMALLINT | 2字节16位有符号整数 | 1 |
INT | 4字节32位有符号整数 | 1 |
BIGINT | 8字节64位有符号整数 | 1 |
FLOAT | 4字节32位单精度浮点数 | 1.0 |
DOUBLE | 8字节64位双精度浮点数 | 1.0 |
BOOLEAN | true,false | true |
STRING | 字符串 | ‘hao’ |
TIMESTAMP | 整型,浮点或字符串 | 1327882394 |
BINARY | 字节数组 | - |
所有这些数据类型都是对Java中的接口实现,因此这些类型具体行为细节和Java中对应的类型完全一致.
集合数据类型
类型 | 描述 | 示例 |
---|---|---|
ARRAY | 一组有序字段。字段的类型必须相同 | Array(1,2) |
MAP | 一组无序的键/值对。键的类型必须是原子的,值可以是任何类型,同一个映射的键的类型必须相同,值得类型也必须相同 | map('a',1,'b',2) |
STRUCT | 一组命名的字段。字段类型可以不同 | Struct(‘a’,1,1,0) |
HDFS文本文件数据编码
Hive中默认记录和字段分隔符
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说,每行都是一条记录,因此换行符可以分割记录 |
^A(Ctrl+A) | 用于分隔字段(列),在CREATE TABLE 语句中可以使用八进制编码\001表示 |
^B | 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键值对之间的分隔,在CREATE TABLE语句中可以使用八进制\002表示 |
^C | 用于MAP中键和值之间的分离。在CREATE TABLE中可以使用八进制编码\003表示 |
综合示例:
CREATE TABLE IF NOT EXISTS mydb.employees
(
name STRING COMMENT 'Employee name',
salary FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT ' Names of subordinates',
deducations MAP<STRING,FLOAT> COMMENT ' Keys are deducations names , Values are percentags',
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT> COMMENT 'Home Address'
)
COMMENT 'the table of empoyee'
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
COLLECTION ITEMS TERMINATED BY '\002'
MAP KEYS TERMINATED BY '\003'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/user/hive/warehouse/mydb.db/employees';
ROW FORMAT DELIMITED : 这组关键字必须些在其他子句之前(除STOREED AS .... 子句)
FIELDS TERMINATED BY : 指定 列 分隔符,使用默认分隔符 ^A
COLLECTION ITEMS TERMINATED BY : 指定 集合 元素间的分割符,使用默认分隔符 ^B
MAP KEYS TERMINATED BY : 指定MAP中 键和值之间的分离,使用默认分隔符 ^C
LINES TERMINATED BY : 指定 行 分隔符,使用默认的换行符 \n
STORED AS TEXTFILE : 指定Hive表的存储格式
LOCATION : 指定数据文件位置
Hive表存储格式
有4种主要的存储格式,使用依据为数据类型和分析需要。但是在绝大数情况下,使用ORC或Parquet,它们为大多数数据类型提供了最佳的压缩和速度优势。
存储格式 | 说明 |
---|---|
Text file | 使用数据已unicode编码的原始文本格式存储 |
Sequence file | 数据以二进制键值对格式存储 |
RCFile | 数据以列优化格式存储 (而不是行优化) |
ORC | 优化的行列格式, 可以显著提高 hive性能 |
Parquet | 一种列格式, 可提供对其他 hadoop 工具的可移植性, 包括Hive, Drill, Impala, Crunch, and Pig |
表类型
在Hive中包括2种类型的表,内部表和外部表。
内部表
创建方式,常规的 CREATE TABLE 语句。对于内部表,由Hive完全控制,如删除了内部表,在Hive的表定义和对应的表数据都会被删除。
外部表
创建方法, CREATE EXTERNAL TABLE IF NOT EXISTS Names_text ,关键字为 EXTRENAL 。对于外部表不由Hive控制,对于外部表只是使用表元数据信息而进入到原始文本数据中。
如果删除了外部表,只有表的元数据信息被删除,实际的数据还是会被保留。数据是驻留在Hive之外的,或者是需要保留原始数据的表。