Hive官方使用手册——数据类型

本文为自己翻译的译文,原文地址: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
    • Hive 0.11.0 引入, 38 位的精度
    • Hive 0.13.0 引入了了用户可定义的精度和规模
  • 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开始可用。)

列类型

整数类型 (TINYINTSMALLINTINT/INTEGERBIGINT)

默认情况下,整型文字被认为是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_timestampfrom_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 - 019999-­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: 可选参数 (+/-)
Y: 年数
M: 月数

INTERVAL '1-2' YEAR TO MONTH

shorthand for:

INTERVAL '1' YEAR +
INTERVAL '2' MONTH

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+
INTERVAL '2' HOUR +
INTERVAL '3' MINUTE +
INTERVAL '4' SECOND +
INTERVAL '5' NANO

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

可选的使用区间关键字

间隔关键字的用法是强制性的。
间隔的表达式(ex: INTERVAL (1+dt) SECOND)

1 DAY
'1-2' YEAR TO MONTH

INTERVAL 1 DAY
INTERVAL '1-2' YEARS TO MONTH

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或之后,他们应该在这些表上执行以下步骤:

  1. 确定您希望为表中的decimal列设置的精度和小数位的位数。确定您希望为表中的decimal列设置的精度和小数位的位数。
  2. 对于表中的每个decimal 列,使用 ALTER TABLE 命令将列定义更新为所需的精度和小数位的位数:

    ALTER TABLE foo CHANGE COLUMN dec_column_name dec_column_name DECIMAL( 38 , 18 );

    如果表不是分区表,那么就完成了。如果表有分区,则继续执行步骤3。

  3. 如果表是一个分区表,则查找表的分区列表:

    SHOW PARTITIONS foo;
     
    ds= 2008 - 04 - 08 /hr= 11
    ds= 2008 - 04 - 08 /hr= 12
    ...
  4. 表中的每个现有分区还必须更改其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

在Hive 0.7.0 (HIVE-537)中引入了UNIONTYPE数据类型,但是在Hive中对这种类型的支持仍然不完全。 在包含UNION TYPE字段的JOIN , WHERE,GROUP BY 查询(HIVE-2508)中子句将会失败,而Hive没有定义语法来提取UNIONTYPE字段的标记或值。这就意味着UNIONTYPE实际上是在实验观察阶段。

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范围之外的数字(大约-1030810308)或非常接近于零(-10-30810-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类型的基本数学运算包括:

这些舍入函数也可以使用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 HiveHive 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

 


猜你喜欢

转载自blog.csdn.net/maizi1045/article/details/79710406