本文为自己翻译的译文,原文地址:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types
Hive官方使用手册——数据类型
概述
这里列出了Hive中所有支持的数据类型。有关附加信息,请参阅教程中的类型系统。
对于HCatalog支持的数据类型,请参见:
数值型
TINYINT
(1-byte 有符号整型, 从-128
至127
)SMALLINT
(2-byte 有符号整型, 从-32,768
至32,767
)INT/INTEGER (4-byte 有符号整型, 从 -2,147,483,648 至 2,147,483,647)
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
NUMERIC
(和DECIMAL
一样,从 Hive 3.0.0开始提供支持)
Date/Time 类型
String Types
Misc Types
BOOLEAN
BINARY
(注: 只是从Hive 0.8.0开始提供支持)
Complex Types
- arrays:
ARRAY<data_type>
(注: 从 Hive 0.14起允许负值和非常量表达式。) - maps:
MAP<primitive_type, data_type>
(注: 从 Hive 0.14起允许负值和非常量表达式。) - structs:
STRUCT<col_name : data_type [COMMENT col_comment], ...>
- union:
UNIONTYPE<data_type, data_type, ...>
(注: 只有从Hive 0.7.0开始可用。)
列类型
整数类型 (TINYINT
, SMALLINT
, INT/INTEGER
, BIGINT
)
默认情况下,整型文字被认为是INT型的,除非这个数字超过了INT的范围,在这种情况下,它被解释为BIGINT,或者如果在这个数字上出现了以下的后缀。
Type |
Postfix |
Example |
---|---|---|
TINYINT |
Y |
100Y |
SMALLINT |
S |
100S |
BIGINT |
L |
100L |
Version
INTEGER
is introduced as a synonym for INT
in Hive 2.2.0 (HIVE-14950).
Strings
字符串可以用单引号(')或双引号(')表示。Hive使用c样式在字符串中转义。
Varchar
Varchar类型创建时需要长度说明符(在1和65535之间),它定义了字符串中允许的最大字符数。如果一个字符串值被转换为varchar类型但是超过了长度说明符,那么字符串将自动被截断。字符长度是由字符串中包含的代码点的数量决定的。
跟字符串一样,尾部空格在varchar中非常重要,并且会影响比较结果。
局限性
非通用的UDF不能直接使用varchar类型作为输入参数或返回值。可以创建字符串UDF,varchar值将转换为字符串并传递给UDF。要直接使用varchar参数或返回varchar值,需要创建一个GenericUDF。
如果它们依赖基于反射的方法来检索类型信息,则可能存在其他不支持varchar的上下文。这包括一些SerDe实现。
Version
Varchar datatype was introduced in Hive 0.12.0 (HIVE-4844).
Char
Char类型与Varchar类似,但它们是固定长度的,这意味着比指定长度值短的部分是用空格填充的,因此在比较时,尾随空格并不重要。最大长度固定在255。
CREATE TABLE foo (bar CHAR(
10
))
|
Version
Char datatype was introduced in Hive 0.13.0 (HIVE-5191).
Timestamps
支持传统的UNIX时间戳和可选的纳秒精度。
支持的表示方式:
- 整型数字类型:以秒为单位解释为UNIX时间戳。
- 浮点数值类型:以秒为单位,以十进制精度解释为UNIX时间戳。
- 字符串:JDBC兼容java.sql.Timestamp格式 "
YYYY-MM-DD HH:MM:SS.fffffffff
" (9位小数精度)
时间戳实际是不被解释时间而是被存储为来自UNIX时代的偏移量。为转换时区提供方便的UDF(to_utc_timestamp
, from_utc_timestamp
)。
所有现有的datetime UDF(月、日、年、小时等)都使用TIMESTAMP
数据类型。
文本文件中的时间戳必须使用的格式为: yyyy-mm-dd hh:mm:ss[.f...]
。 如果它们是另一种格式,将它们声明为适当的类型(INT、FLOAT、STRING等),并使用UDF将它们转换为时间戳。
在表级别上,可以通过向SerDe属性“时间戳”提供格式来支持其他时间戳格式。格式”(as of release 1.2.0 with HIVE-9298)。例如, yyyy-MM-dd'T'HH:mm:ss.SSS,yyyy-MM-dd'T'HH:mm:ss.
Version
Timestamps were introduced in Hive 0.8.0 (HIVE-2272).
Dates
DATE
的值以格式 YYYY-MM-DD
表示了一个年/月/日。 例如,日期“2013-01-01”。日期类型没有时间部分。支持的范围值为日期类型是0000 - 01 - 01至9999-12-31,这依赖原始的Java日期类型的支持。
Version
Dates were introduced in Hive 0.12.0 (HIVE-4055).
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”格式的字符串。 |
Intervals
支持的区间描述 |
样例 |
含义
|
起始版本
|
---|---|---|---|
间隔的时间单位: SECOND / MINUTE / DAY / MONTH / YEAR |
INTERVAL '1' DAY |
an interval of 1 day(s) | Hive 1.2.0 (HIVE-9792). |
年到月的时间区间格式:SY-M S: 可选参数 (+/-) |
INTERVAL '1-2' YEAR TO MONTH | shorthand for: INTERVAL '1' YEAR + |
Hive 1.2.0 (HIVE-9792). |
天到秒的时间区间格式: SD H:M:S.nnnnnn S: 可选参数 (+/-) D: 天数H: 小时数 M: 分钟数 S: 秒数 nnnnnn: 可选的纳秒 |
INTERVAL '1 2:3:4.000005' DAY | shorthand for: INTERVAL '1' DAY+ |
Hive 1.2.0 (HIVE-9792). |
支持常量级间隔 | INTERVAL 1 DAY | aids query readability / portability |
Hive 2.2.0 (HIVE-13557). |
支持间隔表达式: 这可能涉及其他函数/列。 |
INTERVAL (1+dt) DAY | enables dynamic intervals | Hive 2.2.0 (HIVE-13557). |
可选的使用区间关键字 间隔关键字的用法是强制性的。 |
1 DAY |
INTERVAL 1 DAY |
Hive 2.2.0 (HIVE-13557). |
添加timeunit别名以帮助可移植性/可读性。: SECONDS / MINUTES / HOURS / DAYS / WEEKS / MONTHS / YEARS |
2 SECONDS | 2 SECOND | Hive 2.2.0 (HIVE-13557). |
Decimals
Version
Decimal datatype was introduced in Hive 0.11.0 (HIVE-2693) and revised in Hive 0.13.0 (HIVE-3976).
NUMERIC
is the same as DECIMAL
as of Hive 3.0.0 (HIVE-16764).
Hive中的DECIMAL
类型是基于Java的BigDecimal,它用于表示Java中不可变的任意精度十进制数。所有常规的数字操作(例如:+、-、*、/)和相关的UDF(例如:Floor、Ceil、Round和更多)处理十进制类型。 您可以将小数类型和其他数值类型可以相互转换。小数类型的持久化格式支持使用科学和非科学符号表示。因此,无论您的数据集是否包含像4.004E+3(科学符号)或4004(非科学符号)或两者都有,都可以使用DECIMAL
类型。
- Hive 0.11和0.12中
DECIMAL
具有固定的精度,限制为38位。 - 在Hive 0.13中,用户可以使用语法DECIMAL(precision, scale)来指定小数的位数和精度来创建具有
DECIMAL
数据类型的表。如果没有指定小数的位数,则默认为0(没有小数位数)。如果没有指定精度,则默认为10。
CREATE TABLE foo (
a DECIMAL, -- Defaults to decimal(
10
,
0
)
b DECIMAL(
9
,
7
)
)
|
对于使用,请参见下面的文字部分中的浮点类型。
Decimal Literals
整体数值比BIGINT大,必须用Decimal(38,0)处理。需要加后缀BD。例子:
select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;
Hive 0.12.0和0.13.0之间的Decimal类型不兼容。
在Hive 0.13.0中Decimal数据类型发生了变化,Hive 0.13.0之前的版本中列(类型为“Decimal”)将被视为小数类型(10,0)。这意味着从这些表中读取的现有数据将被处理为10位数的整数值,而写入这些表的数据将在写入之前转换为10位数的整数值。To avoid these issues, Hive users on 0.12 or earlier with tables containing Decimal columns will be required to migrate their tables, after upgrading to Hive 0.13.0 or later.为了避免这些问题,在0.12或更早的时候使用包含十进制列的表的Hive用户将被要求迁移他们的表,在升级到Hive 0.13.0或更高版本之后。
升级Hive 0.13.0之前版本的Decimal列
如果用户在Hive 0.12.0或更早的时候创建了带有decimal列的表,那么在升级到Hive 0.13.0或之后,他们应该在这些表上执行以下步骤:
- 确定您希望为表中的decimal列设置的精度和小数位的位数。确定您希望为表中的decimal列设置的精度和小数位的位数。
对于表中的每个decimal 列,使用 ALTER TABLE 命令将列定义更新为所需的精度和小数位的位数:
ALTER TABLE foo CHANGE COLUMN dec_column_name dec_column_name DECIMAL(
38
,
18
);
如果表不是分区表,那么就完成了。如果表有分区,则继续执行步骤3。
如果表是一个分区表,则查找表的分区列表:
SHOW PARTITIONS foo;
ds=
2008
-
04
-
08
/hr=
11
ds=
2008
-
04
-
08
/hr=
12
...
表中的每个现有分区还必须更改其DECIMAL 列以添加所需的精度/小数位位数。
这可以通过使用动态分区(在Hive 0.14或更高版本中HIVE-8411)来执行ALTER TABLE CHANGE COLUMN完成:
SET hive.exec.dynamic.partition =
true
;
-- hive.exec.dynamic.partition needs to be set to
true
to enable dynamic partitioning with ALTER PARTITION
-- This will alter all existing partitions of the table - be sure you know what you are doing!
ALTER TABLE foo PARTITION (ds, hr) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(
38
,
18
);
或者,可以通过在每个语句中指定一个分区,使用ALTER TABLE CHANGE COLUMN的时候执行一个分区。(Hive 0.14及之后的版本可用):
ALTER TABLE foo PARTITION (ds=
'2008-04-08'
, hr=
11
) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(
38
,
18
);
ALTER TABLE foo PARTITION (ds=
'2008-04-08'
, hr=
12
) CHANGE COLUMN dec_column_name dec_column_name DECIMAL(
38
,
18
);
...
下面的浮点类型会进一步讨论Decimal数据类型。
Union Types
UNIONTYPE support is incomplete
Union类型在任何一点上都可以准确地保存它们指定的数据类型。您可以使用create_union
UDF创建一个这种类型的实例:
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}
反序列化联合的第一部分是标记,它让我们知道union的哪一部分正在被使用。在本例中,0表示来自定义的第一个data_type,它是一个int等。
要创建一个联合,您必须向create_union
UDF提供此标记:
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"}}
Literals
Floating Point Types
浮点文字被假定为DOUBLE。这里科学符号还没有得到支持。
Decimal Types
Version
Decimal datatype was introduced in Hive 0.11.0 (HIVE-2693). See Decimal Datatype above.
NUMERIC
is the same as DECIMAL
as of Hive 3.0.0 (HIVE-16764).
Decimal类型为浮点数提供了比Double更加精确的值和更大的范围。Decimal 数据类型存储数字值的精确表示,而双数据类型只是存储非常接近数值的近似。
Decimal类型被使用在一些DOUBLE类型的近似值精度不够的用例中,例如金融应用程序,等于和不等校验和舍入操作,需要使用Decimal类型。它们还需要处理DOUBLE范围之外的数字(大约-10308到10308)或非常接近于零(-10-308到10-308)。关于DOUBLE类型的限制的一般性讨论,请参阅Wikipedia文章的双精度浮点格式。
Hive中Decimal类型的精度被限制到38位。查阅HIVE-4271 和HIVE-4320 获取更多关于选择这个限制的原因的评论。
Using Decimal Types
您可以在Hive中创建一个使用Decimal类型的表,其语法如下:
create table decimal_1 (t decimal);
|
decimal_1是一个表,其中有一个类型为decimal的字段t,它基本上是一个Decimal类型。
您可以使用LazySimpleSerDe或LazyBinarySerDe来在这样的表中读取和写入值。例如:
alter table decimal_1 set serde
'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
;
|
or:
alter table decimal_1 set serde
'org.apache.hadoop.hive.serde2.lazy.LazyBinarySerDe'
;
|
您可以使用转换将Decimal值转换为任何其他原始类型,如布尔值。例如:
select cast(t as
boolean
) from decimal_2;
|
数学UDFs
Decimal还支持许多算术运算符、数学UDF和UDAFs,其语法与DOUBLE的情况相同。
可以使用Decimal类型的基本数学运算包括:
- Positive
- Negative
- Addition
- Subtraction
- Multiplication
- Division
- Average (avg)
- Sum
- Count
- Modulus (pmod)
- Sign – Hive 0.13.0 and later
- Exp – Hive 0.13.0 and later
- Ln – Hive 0.13.0 and later
- Log2 – Hive 0.13.0 and later
- Log10 – Hive 0.13.0 and later
- Log(base) – Hive 0.13.0 and later
- Sqrt – Hive 0.13.0 and later
- Sin – Hive 0.13.0 and later
- Asin – Hive 0.13.0 and later
- Cos – Hive 0.13.0 and later
- Acos – Hive 0.13.0 and later
- Tan – Hive 0.13.0 and later
- Atan – Hive 0.13.0 and later
- Radians – Hive 0.13.0 and later
- Degrees – Hive 0.13.0 and later
这些舍入函数也可以使用Decimal类型:
- Floor
- Ceiling
- Round
幂(小数,n)只支持指数n的正整数。
Casting Decimal Values
在Decimal和任何其他基本类型(如整数、double、boolean等)之间支持转换。
Testing Decimal Types
在Hive中添加了两个新的测试作为TestCliDriver框架的一部分。他们是decimal_1.q和decimal_2.q。其他测试例如udf7.q覆盖了上面提到的udf的范围。
需要添加更多的测试来证明失败或某些类型的类型转换被阻止(例如,强制转换日期)。在舍入函数中有一些不明确的地方,因为小数的四舍五入并不完全符合SQL标准,因此在当前的工作中省去了它。
有关运行Hive测试的一般信息,请参见How to Contribute to Apache Hive和Hive Developer FAQ。
空值处理
缺失值由特殊值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 |