环境

  • 宿主机: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、Hive-数据类型

----0.0 基本(数据)类型(Primitive Types)

----0.1 复杂/集合(数据)类型(Complex Types)

1、文本文件数据编码

2、文件存储格式

----2.0 Avro Files:Avro存储格式

----2.1 ORC Files:优化了的行列存储格式

----2.2 Parquet:按列存储格式

----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)

数值型

类型描述
TINYINT1-byte 有符号整型, 从-128 至 127
SMALLINT2-byte 有符号整型, 从-32,768 至 32,767
INT/INTEGER4-byte 有符号整型, 从 -2,147,483,648 至 2,147,483,647。默认情况下,整型数字被认为是INT类型,除非超出了范围(就是BIGINT了)、或有后缀(如:Y、S、L,分别对应TINYINT、SMALLINT、BIGINT)
BIGINT8-byte 有符号整型,从 -9,223,372,036,854,775,808 至 9,223,372,036,854,775,807
FLOAT4-byte 单精度浮点数
DOUBLE8-byte 双精度浮点数
DOUBLE PRECISIONDOUBLE的别名,从Hive 2.2.0开始提供支持
DECIMALHive 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_timestampfrom_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”格式的字符串

字符串类型

类型描述
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)

类型描述
BOOLEANTRUE/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表中比未压缩存储的性能更好。

可以将压缩为GzipBzip2的文本文件直接导入到存储为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都极力将各种错误恢复过来。

今后在实际用到它们时,再作详细补充

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐