[Hive] 03 - 基础知识之【数据类型、文本文件数据编码、文件存储格式、读时模式】
环境宿主机:Windows 10 64_bit虚拟机:VMware pro 12CentOS 7.5 64_bitHadoop-2.6.5MariaDB-5.5.60Hive 1.2.2SecureCRT 7.3目录0、Hive-数据类型----0.0 基本(数据)类型(Primitive Types)----0.1 复杂/集合(数据)类型(Complex Typ...
环境
- 宿主机:Windows 10 64_bit
- 虚拟机:VMware pro 12
- CentOS 7.5 64_bit
- Hadoop-2.6.5
- MariaDB-5.5.60
- Hive 1.2.2
- SecureCRT 7.3
目录
----0.0 基本(数据)类型(Primitive Types)
----0.1 复杂/集合(数据)类型(Complex Types)
----2.3 Compressed Data Storage:压缩数据存储格式
----2.4 LZO Compression:LZO压缩存储格式
正文
0、Hive-数据类型
下方将列出在Hive中所有支持的数据类型。可参考
注意:对HCatalog支持的数据类型参考。
Hive 支持关系数据库中的大多数基本数据类型,同时也支持关系型数据库中并不支持的4种集合数据类型(因为使用它们会趋向于破坏标准格式,增大数据冗余风险,进而消耗不必要的磁盘空间;甚至还会造成数据不一致)。
在大数据系统中,不遵循标准格式的一个好处:可提供更高吞吐量的数据。当处理的数据的数量级是T、或P时,以最少的“头部寻址”来从磁盘上扫描数据是非常必要的。按数据集进行封装的话,可通过减少寻址次数来提高查询速度。
在使用过程中,需要考虑两个问题:
- 这些数据类型 是如何在文本文件中进行表示的
- 文本存储中为了解决各种性能问题、以及其它问题时,有哪些替代方案
Hive是一个数据仓库软件、一个查询引擎,和大多数的数据库相比,Hive有一个独特功能:它对于数据 在文件中的编码方式具有非常大的灵活性。大多数的数据库对数据具有完全的控制,包括对数据存储到磁盘的过程的控制、对数据生命周期的控制等。而Hive将这些方面的控制权给到用户手中,以便更加容易地使用各种各样的工具来管理、处理数据。
以下这些在Hive中都是保留字。所有这些数据类型都是对Java中的接口的实现,也就是说:这些数据类型的具体行为细节和Java中对应的数据类型是完全一致的。但是:有些在Java中支持的数据类型,在Hive中不一定支持。
Hadoop、Hive强调优化磁盘的读、写性能,而限制列的值的长度相对来说并不重要。同时,Hive支持使用不同的文件格式,根据不同字段间的分隔符来对其进行判断。
0.0 基本(数据)类型(Primitive Types)
数值型
类型 | 描述 |
---|---|
TINYINT | 1-byte 有符号整型, 从-128 至 127 |
SMALLINT | 2-byte 有符号整型, 从-32,768 至 32,767 |
INT/INTEGER | 4-byte 有符号整型, 从 -2,147,483,648 至 2,147,483,647。默认情况下,整型数字被认为是INT类型,除非超出了范围(就是BIGINT了)、或有后缀(如:Y、S、L,分别对应TINYINT、SMALLINT、BIGINT) |
BIGINT | 8-byte 有符号整型,从 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807 |
FLOAT | 4-byte 单精度浮点数 |
DOUBLE | 8-byte 双精度浮点数 |
DOUBLE PRECISION | DOUBLE的别名,从Hive 2.2.0开始提供支持 |
DECIMAL | Hive 0.11.0 引入, 38 位的精度;Hive 0.13.0 引入了用户可定义的精度和规模 |
NUMERIC | 和 DECIMAL一样,从 Hive 3.0.0开始提供支持 |
如果在查询中将一个FLOAT
类型的列、一个DOUBLE
类型的列作对比(或将一种整型类型的值、另一种整型类型的值作对比),那么Hive会隐式地将类型转换为两个整型类型中值较大的那个类型,即 将FLOAT
转换为DOUBLE
。
如果用户希望将一个字符串类型的列 转换为数值,那么可显示地将一种数据类型转换为其他一种数据类型,例:s
是一个字符串类型的列,其值为整数
...cast (s as int) ...;
其中,关于 DECIMAL
(小数,为浮点数提供了比DOUBLE
更加精确的值和更大的范围)可参考。
Date/Time类型
类型 | 描述 |
---|---|
TIMESTAMP | 从Hive 0.8.0开始提供支持。没有时区的日期和时间 |
DATE | 从Hive 1.2.0开始提供支持。以格式 YYYY-MM-DD 表示了一个年/月/日 |
INTERVAL | 从Hive 1.2.0开始提供支持。时间间隔 |
TIMESTAMP
TIMESTAMP
的值可以是:整数、距离UNIX新纪元时间(1970-1-1 0.0.0
)的秒数、浮点数(距离UNIX新纪元时间的秒数,精确到纳秒,即小数点后保留的9位数)、字符串(JDBC所约定的时间字符串格式为 YYYY-MM-DD hh:mm:ss.ffffffff
)
TIMESTAMP
表示的是UTC时间。Hive本身提供了不同时区间互相转换的内置函数,如:to_utc_timestamp
、from_utc_timestamp
。
- Casting Dates(日期类型转换)
转换 | 结果 |
---|---|
cast(date as date) | 相同的日期值 |
cast(timestamp as date) | 时间戳的年/月/日是根据本地时区确定的,并作为日期值返回 |
cast(string as date) | 如果字符串是“YYYY-MM-DD” ,则返回对应于该年/月/日 的日期值。如果字符串值不匹配此formate,则返回NULL |
cast(date as timestamp) | 时间戳值对应于日期值的年/月/日 的午夜,基于本地时区 |
cast(date as string) | 以日期为代表的年/月/日 格式转换为“YYYY-MM-DD” 格式的字符串 |
INTERVAL
,具体参考
字符串类型
类型 | 描述 |
---|---|
STRING | 字符串,即字符序列。用单引号或双引号表示,在需要时可进行转义 |
VARCHAR | 只是从Hive 1.2.0开始提供支持。具有最大长度的指定字符集中的字符序列 |
CHAR | 只是从Hive 0.13.0开始提供支持。字符 |
VARCHAR
类型创建时需要长度说明符(在1和65535之间),它定义了字符串中允许的最大字符数。如果一个字符串值被转换为VARCHAR
类型类型但是超过了长度说明符,那么字符串将自动被截断。字符长度是由字符串中包含的代码点的数量决定的。
跟字符串一样,尾部空格在VARCHAR
中非常重要,并且会影响比较结果。
局限性
非通用的UDF不能直接使用VARCHAR
类型作为输入参数或返回值。可以创建字符串UDF,VARCHAR
值将转换为字符串并传递给UDF。要直接使用VARCHAR
参数或返回VARCHAR
值,需要创建一个GenericUDF。
如果它们依赖基于反射的方法来检索类型信息,则可能存在其他不支持VARCHAR
的上下文。这包括一些SerDe实现。
CHAR
类型与VARCHAR
类似,但它们是固定长度的,这意味着比指定长度值短的部分是用空格填充的,因此在比较时,尾随空格并不重要。最大长度固定在255。
create table foo (bar char(10)
其他类型(Misc Types)
类型 | 描述 |
---|---|
BOOLEAN | TRUE/FALSE |
BINARY | 只是从Hive 0.8.0开始提供支持。一个字节序列(数组) |
BINARY
的列 是存储在记录中的,它可以在记录中包含任意字节,以防止Hive尝试将其作为数字、字符串等进行解析。不过,如果需要省略掉每行记录的尾部,则无需使用BINARY
,比如 一个表的表结构指定3列,而实际数据文件每行记录包含有5个字段。
0.1 复杂/集合(数据)类型(Complex Types)
类型 | 描述 | 示例 |
---|---|---|
arrays: ARRAY<data_type> | 从 Hive 0.14起,允许负值和非常量表达式。数组是一组具有相同类型、名称的变量的集合。这些变量是数组的元素,每个元素都有一个下标,从0开始 | array('foo1','foo2') |
maps: MAP<primitive_type, data_type> | 从 Hive 0.14起,允许负值和非常量表达式。是一组键值对集合 | map('first', 'foo1', 'last', 'foo2') |
structs: STRUCT<col_name : data_type [COMMENT col_comment], ...> | 可通过点符号. 访问元素的内容。可以混合多种不同的数据类型 | struct('foo1', 'foo2') |
union: UNIONTYPE<data_type, data_type, ...> | 只有从Hive 0.7.0开始可用 | UNIONTYPE 可参考 |
1、文本文件数据编码
最常见的以逗号(,
)、或制表符分割的文本文件:
- CSV,以逗号(
,
)为分割值 - TSV,以制表符为分隔值
这两种文件格式有一个共同缺点:当需要对文本文件中那些不需要作为分隔符处理的逗号、制表符时,得格外小心。
因此,Hive有4个默认的记录和字段分隔符(它们很少出现在字段值中),Hive使用术语field
表示替换默认分隔符的字符:
分隔符 | 描述 |
---|---|
\n | 对于文本文件来说,每行都是一条记录,因此换行符(\n )可以分割记录 |
^A | 用于分割字段(列)。在create talbe 语句中可以使用八进制编码\001 表示 |
^B | 用于分割ARRAY或STRUCT中的元素,或用于MAP中键值对之间的分割。在create talbe 语句中可以使用八进制编码\002 表示 |
^C | 用于MAP中键值对之间的分割。在create talbe 语句中可以使用八进制编码\003 表示 |
不过,使用分隔符表示的语句可读性很差,不过Hive能读取这些数据。
这些规则,只会影响到Hive在读取文件后,如何对其进行划分。大部分情况下,都是使用默认的分隔符。
这种强大的可定制的功能让Hive可以很容易地处理由其他工具、各种各样的ETL(数据抽取、转换、装载)程序产生的文件。
2、文件存储格式
2.0 Avro Files:Avro存储格式
Avro是一种数据序列化系统,依赖于模式(Schema)。AvroSerde是Avro Serializer Deserializer(Avro数据的序列化和反序列化)的简写。
Hive 0.9.1+
起,才支持AvroSerde。它允许用户读取、或写入Avro数据到Hive表中。
在Hive中使用Avro:有以下知识点
- 注意事项
- Hive和Avro版本依赖
- Avro到Hive的类型转换
- 使用AvroSerDe可以在Hive中创建avro支持的表
- 把Hive表写入Avro文件
- Avro file 扩展
- 指定表的Avro模式
- HBase 整合:Hive 0.14.0支持在HBase列中存储和查询Avro对象,使其可视为Hive结构
更多关于可参考
2.1 ORC Files:优化了的行列存储格式
Optimized Row Columnar(ORC,优化的行列),这个件格式提供了存储Hive数据的高效方法。它的设计是为了克服其他Hive文件格式的限制。使用ORC文件可以提高Hive在读取、写入和处理数据时的性能。
Hive 0.11.0+
起,开始引入ORC。
更多关于可参考
2.2 Parquet:按列存储格式
Parquet (http://parquet.io/)是Hadoop的一种生态系统广阔的按列存储格式。
Hive 0.10、0.11
中,Parquet以插件的形式支持Hive;Hive 0.12、0.13、以及更高版本
中以本地化支持Hive。
更多关于可参考
2.3 Compressed Data Storage:压缩数据存储格式
在某些情况下,无论是在磁盘使用方面还是在查询性能方面,将压缩的数据保存在Hive表中比未压缩存储的性能更好。
可以将压缩为Gzip
或Bzip2
的文本文件直接导入到存储为TextFile
的表中。压缩会被自动检测,并且在查询执行期间,文件将在运行时被动态解压缩。
更多关于可参考
2.4 LZO Compression:LZO压缩存储格式
LZO(Lempel-Ziv-Oberhumer)是致力于解压速度的无损的一种数据压缩算法。
更多关于可参考
3、读时模式(schema on read)
向传统数据库写入数据时,不管是采用装载外部数据的方式、还是采用将一个查询的输出结果写入的方式、或者使用UPDATA
语句,等等,数据库对于存储都具有完全的控制力。即 传统数据库是【写时模式(schema on write)】,数据在写入数据库时对模式进行检查。
Hive对底层存储并没有这样的控制。对于Hive要查询的数据,有很多种方式对其进行创建、修改等。因此,Hive不会在数据加载时进行验证,而是在查询时进行,即 读时模式(schema on read)。
如果模式、文件内容两者不匹配,Hive对其处理得非常好,因为它可以读取这些数据。举例:
- 如果每行记录中的字段个数少于对应的模式中定义的字段个数,那么将会看到查询结果中有很多null值。
- 如果某些字段是数值型,但Hive在读取时,发现存在非数值型的字符串值,那么对于这些字段将会返回null值。
- 总之,Hive都极力将各种错误恢复过来。
今后在实际用到它们时,再作详细补充
更多推荐
所有评论(0)