Hive语言手册之三:数据类型



 

一、概述

以下是Hive支持的所有数据类型

1、数值类型

1TINYINT         1字节带符号整数,取值范围-128 to 127

2SMALLINT     2字节带符号整数,取值范围-32,768 to 32,767

3INT                 4字节带符号整数,取值范围-2,147,483,648 to 2,147,483,647

4BIGINT           8字节带符号整数,取值范围-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807

5FLOAT            4字节单精度浮点数

6DOUBLE         8字节双精度浮点数

7DECIMAL        Hive0.11.0开始引入,表示38位精度的数值,从Hive0.13.0引入可自定义精度与取值范围的DECIMAL类型的数

2、日期时间类型

1) TIMESTAMP     Hive 0.8.0开始引入

2DATE               Hive 0.12.0开始引入

3、字符串类型

1STRING

2VARCHAR      Hive 0.12.0开始引入

3CHAR              Hive 0.13.0开始引入

4、混杂(Misc)类型

1BOOLEAN

2BINARY          Hive 0.8.0开始引入

5、复合(Complex)类型

1arrays:   ARRAY<data_type>

2maps:   MAP<primitive_type,data_type>

3structs:  STRUCT<col_name :data_type [COMMENT col_comment], ...>

4union:   UNIONTYPE<data_type,data_type, ...> (: Hive 0.7.0开始引入)

二、列类型

1、整数类型(TINYINT,SMALLINT, INT, BIGINT)

整型常量默认以INT型表示, 如果数值超过INT的取值范围,自动以BIGINT型表示。如果加了强制后缀,则按照后缀指示的类型表示.

类型                   后缀         示例                  

TINYINT                Y             100Y

SMALLINT             S             100S

BIGINT                  L             100L

2Strings

字符串常量用单引号或者双引号表示,在字符串常量中,像C语言那样使用转义字符.

3Varchar

使用Varchar类型变量的时候需要定义字串的长度(取值范围在1--65355), 用于指明可接受的最大字符个数。当一个String字串被转换成或赋值给一个Varchar变量时,如果String字串的长度超过了Varchar变量长度,超长部分会被自动截取掉,Varchar变量最终长度由截取后的字符串包含的码点数量确定。像String一样,Varchar尾部的空格是有意义的,并且会影响比较运算的结果。

Non-generic UDFs不能直接使用varchar类型作为输入参数或者返回结果。String类型的UDFs会把varchar类型的值转换成strings传递给UDF. 为了可以直接使用varchar类型做参数或者直接返回varchar的值,需要创建Generic UDF。还有另外一些情况不支持varchar,比如依赖反射技术用于返回类型信息的方法,包括一些Serde的实现.

4Char

CharVarchar比较像,但是它是定长的。当字符的个数小于定义的长度时,尾部以空格填充,但是尾部的空格是无意义的,不影响比较运算的结果。Char的最大长度为255

5Timestamps

支持传统的UNIX timestamp,可以达到纳秒精度,支持的转换(Supported conversions:

       整数类型:以秒为单位转换为UNIXtimestamp

       浮点类型:按照decimal精度以秒为单位转换为UNIX timestamp

       Strings类型:JDBC服从java.sql.Timestamp格式"YYYY-MM-DD HH:MM:SS.fffffffff" (9位小数的精度)

Timestamps是自从UNIX诞生点(1970-1-1 0:00:00)开始的时间(秒数),跟时区无关,同时也可以很方便地实现与UTC_timestamp之间进行转换。所有的日期时间函数(datetime UDFs)像month, day, year, hour等也可以用于TIMESTAMP类型。

在文本文件中,Timestamps必须使用格式yyyy-mm-dd hh:mm:ss[.f...],如果是其他的格式,则需要把它们定义成合适的类型 (INT, FLOAT, STRING, 等等),并且使用UDF转换。

6Dates

DATE值的格式是YYYY-¬MM—DD,只有年、月、日,没有时间部分。该类型的取值范围为0000-¬01-¬01 to 9999-¬12-¬31

Date类型可以使用Cast函数与Date Timestamp String三种类型进行相互转换:

cast(date as date)

Same date value

cast(timestamp as date)

Timestamp数据转换成基于本地时区的Date值,格式为yyyy/mm/dd

cast(string as date)

如果字串的格式是'YYYY-MM-DD', 则返回同样格式的Date值,否则返回NULL

cast(date as timestamp)

返回基于本地时区的当日零点时的Timestamp

cast(date as string)

返回'YYYY-MM-DD'格式的字串.

7Decimals

DECIMAL类型基于Java中表达任意精度的十进制数的BigDecimal,可以进行+, -, *, /等代数运算及Floor, Ceil, Round 等相关的数学函数运算,可以方便地与其他数值型数据使用CAST进行类型转换。可以同时支持科学记数法与非科学记数法数据混合存在。例如在一个列中,可以允许同时有1E+444004存在。

Hive 0.11 and 0.12DECIMAL的精度固定是38位,从Hive 0.13 开始,可以在创建表时指定DECIMAL类型列的总长度与小数位数,例如:

CREATE TABLE foo (
  a DECIMAL,
  b DECIMAL(9, 7)
)

Decimal常量能够表示精度与数值范围都要超过DOUBLE型的浮点数。 Decimal 数据类型存储精确的数值,DOUBLE类型只能存储近似值。Decimal类型一般用在那些无法用近似的DOUBLE类型表示的场合,比如金融领域的等与不等的检查、取整操作等。有时需要使用Decimal类型表达超过DOUBLE型取值范围的数据,或者表达非常小的数据 (-10-308 to 10-308)

Decimal类型数据支持基本代数运算、数学UDFsUDAF,使用语法跟DOUBLE完全一样。DECIMAL类型数据支持的基本数学操作包括:

  • Floor
  • Ceiling
  • Round
  • Power      指数只能为正整数

通过CAST函数支持DECIMAL类型数据与其他任何基本数据类型之间的转换,比如像integer, double, boolean,等等。通过CAST进行类型转换时,需要对DECIMAL类型验证,脚本文件udf7.q可以验证上面提到的所有UDFs。在HiveTestCliDriver framework 添加了两个DECIMAL类型验证脚本: decimal_1.q decimal_2.q。三个取整函数因为无法明确进行验证,当前已经不对其验证。

8Union类型

Union类型从Hive 0.7.0 (HIVE-537)引入,在HIVE-2390做了更深入的介绍。

可以把Union类型数据的一部分准确的按照它本身的类型从整个数据中取出来,可以使用create_union UDF创建Union类型的实例。示例如下

CREATE TABLE union_test(foo UNIONTYPE<int, double, array<string>, struct<a:int,b:string>>);
 
SELECT foo FROM union_test;
 
{0:1}
{1:2.0}
{2:["three","four"]}
{3:{"a":5,"b":"five"}}
{2:["six","seven"]}
{3:{"a":8,"b":"eight"}}
{0:9}
{1:10.0}

在上面的查询结果中,最左边的Tag指明属于整个UNION的哪一部分。Tag=0意味着属于第一个数据类型:整数,Tag=2意味着属于第三个数据类型:数组。下面示例说明了如何通过给create_union UDF指定Tag来创建Union:

SELECT create_union(0, key), create_union(if(key<100, 0, 1), 2.0, value), create_union(1, "a", struct(2, "b")) FROM src LIMIT 2;
 
{0:"238"}      {1:"val_238"}  {1:{"col1":2,"col2":"b"}}
{0:"86"}       {0:2.0} {1:{"col1":2,"col2":"b"}}

四、处理NULL

缺失值以NULL表示。导入带有Null域的数据时,需要检查元数据库SerDe的文档。缺省文本格式使用LazySimpleSerDe规则,在导入数据时它把字串\N看作NULL

五、隐含的数据转换

 

void

boolean

tinyint

smallint

int

bigint

float

double

decimal

string

varchar

timestamp

date

binary

void to

true

true

true

true

true

true

true

true

true

true

true

true

true

true

boolean to

false

true

false

false

false

false

false

false

false

false

false

false

false

false

tinyint to

false

false

true

true

true

true

true

true

true

true

true

false

false

false

smallint to

false

false

false

true

true

true

true

true

true

true

true

false

false

false

int to

false

false

false

false

true

true

true

true

true

true

true

false

false

false

bigint to

false

false

false

false

false

true

true

true

true

true

true

false

false

false

float to

false

false

false

false

false

false

true

true

true

true

true

false

false

false

double to

false

false

false

false

false

false

false

true

true

true

true

false

false

false

decimal to

false

false

false

false

false

false

false

false

true

true

true

false

false

false

string to

false

false

false

false

false

false

false

true

true

true

true

false

false

false

varchar to

false

false

false

false

false

false

false

true

true

true

true

false

false

false

timestamp to

false

false

false

false

false

false

false

false

false

true

true

true

false

false

date to

false

false

false

false

false

false

false

false

false

true

true

false

true

false

binary to

false

false

false

false

false

false

false

false

false

false

false

false

false

true

 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值