您的位置:首页 > 其它

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

2014-04-04 11:10 190 查看


一、概述

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

1、数值类型

(1)TINYINT
1字节带符号整数,取值范围-128to127

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

(3)INT4字节带符号整数,取值范围-2,147,483,648
to2,147,483,647

(4)BIGINT8字节带符号整数,取值范围-9,223,372,036,854,775,808
to9,223,372,036,854,775,807

(5)FLOAT4字节单精度浮点数

(6)DOUBLE8字节双精度浮点数

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

2、日期时间类型

(1)TIMESTAMP
从Hive0.8.0开始引入

(2)DATE
从Hive0.12.0开始引入

3、字符串类型

(1)STRING

(2)VARCHAR
从Hive0.12.0开始引入

(3)CHAR
从Hive0.13.0开始引入

4、混杂(Misc)类型

(1)BOOLEAN

(2)BINARY
从Hive0.8.0开始引入

5、复合(Complex)类型

(1)arrays:
ARRAY<data_type>

(2)maps:
MAP<primitive_type,data_type>

(3)structs:
STRUCT<col_name:data_type[COMMENTcol_comment],...>

(4)union:
UNIONTYPE<data_type,data_type,...>(注:
从Hive0.7.0开始引入)

二、列类型

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


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

类型
后缀
示例

TINYINTY100Y

SMALLINT
S100S

BIGINT
L100L

2、Strings

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

3、Varchar

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

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

4、Char

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

5、Timestamps

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


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


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


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转换。

6、Dates


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

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

cast(dateasdate)
Samedatevalue
cast(timestampasdate)
把Timestamp数据转换成基于本地时区的Date值,格式为yyyy/mm/dd
cast(stringasdate)
如果字串的格式是'YYYY-MM-DD',
则返回同样格式的Date值,否则返回NULL。
cast(dateastimestamp)
返回基于本地时区的当日零点时的Timestamp值

cast(dateasstring)
返回'YYYY-MM-DD'格式的字串.

7、Decimals

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

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

CREATETABLEfoo(

aDECIMAL,

bDECIMAL(9,7)

)


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

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

Positive

Negative

Addition

Subtraction

Multiplication

Division

Average(avg)

Sum

Count

Modulus(pmod)

Sign–Hive0.13.0
andlater

Exp–Hive0.13.0and
later

Ln–Hive0.13.0and
later

Log2–Hive0.13.0and
later

Log10–Hive0.13.0and
later

Log(base)–Hive
0.13.0andlater

Sqrt–Hive0.13.0and
later

Sin–Hive0.13.0and
later

Asin–Hive0.13.0and
later

Cos–Hive0.13.0and
later

Acos–Hive0.13.0and
later

Tan–Hive0.13.0and
later

Atan–Hive0.13.0and
later

Radians–Hive0.13.0and
later

Degrees–Hive0.13.0and
later

Floor

Ceiling

Round

Power
指数只能为正整数

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

8、Union类型

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

可以把Union类型数据的一部分准确的按照它本身的类型从整个数据中取出来,可以使用
create_union

UDF创建Union类型的实例。示例如下

CREATETABLEunion_test(fooUNIONTYPE<int,double,array<string>,struct<a:int,b:string>>);


SELECTfooFROMunion_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:

SELECTcreate_union(0,key),create_union(if(key<100,0,1),2.0,value),create_union(1,"a",struct(2,"b"))FROMsrcLIMIT2;


{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
voidto
true
true
true
true
true
true
true
true
true
true
true
true
true
true
booleanto
false
true
false
false
false
false
false
false
false
false
false
false
false
false
tinyintto
false
false
true
true
true
true
true
true
true
true
true
false
false
false
smallintto
false
false
false
true
true
true
true
true
true
true
true
false
false
false
intto
false
false
false
false
true
true
true
true
true
true
true
false
false
false
bigintto
false
false
false
false
false
true
true
true
true
true
true
false
false
false
floatto
false
false
false
false
false
false
true
true
true
true
true
false
false
false
doubleto
false
false
false
false
false
false
false
true
true
true
true
false
false
false
decimalto
false
false
false
false
false
false
false
false
true
true
true
false
false
false
stringto
false
false
false
false
false
false
false
true
true
true
true
false
false
false
varcharto
false
false
false
false
false
false
false
true
true
true
true
false
false
false
timestampto
false
false
false
false
false
false
false
false
false
true
true
true
false
false
dateto
false
false
false
false
false
false
false
false
false
true
true
false
true
false
binaryto
false
false
false
false
false
false
false
false
false
false
false
false
false
true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: