Hive 数据类型

Overview

这列出了 Hive 中所有受支持的数据类型。有关其他信息,请参见Tutorial中的Type System

有关 HCatalog 支持的数据类型,请参见:

Numeric Types

  • TINYINT(1 字节有符号整数,从-128127)

  • SMALLINT(2 字节有符号整数,从-32,76832,767)

INT/INTEGER (4-byte signed integer, from -2,147,483,648 to 2,147,483,647)
  • BIGINT(8 字节有符号整数,从-9,223,372,036,854,775,8089,223,372,036,854,775,807)

  • FLOAT(4 字节单精度浮点数)

  • DOUBLE(8 字节双精度浮点数)

DOUBLEPRECISION(alias for DOUBLE,only available starting withHive 2.2.0)
  • DECIMAL

  • 在 Hive 0.11.0中引入,精度为 38 位

    • Hive 0.13.0引入了用户可定义的精度和比例
  • NUMERIC(与DECIMAL相同,以Hive 3.0.0开头)

Date/Time Types

String Types

Misc Types

  • BOOLEAN

  • BINARY(注意:仅从 Hive 0.8.0开始可用)

Complex Types

  • 数组:ARRAY<data_type>(注意:从Hive 0.14开始,允许使用负值和非常数表达式。)

  • Map:MAP<primitive_type, data_type>(注意:从Hive 0.14开始,允许使用负值和非常数表达式。)

  • 结构:STRUCT<col_name : data_type [COMMENT col_comment], ...>

  • 联合:UNIONTYPE<data_type, data_type, ...>(注意:仅从 Hive 0.7.0开始可用。)

Column Types

整数类型(TINYINT,SMALLINT,INT/INTEGER,BIGINT)

默认情况下,假定整数 Literals 为INT,除非数字超出INT的范围,在这种情况下它将被解释为 BIGINT,或者数字上存在以下后缀之一。

TypePostfixExample
TINYINTY100Y
SMALLINTS100S
BIGINTL100L

Version

在 Hive 2.2.0(HIVE-14950)中引入INTEGER作为INT的同义词。

Strings

字符串 Literals 可以用单引号(')或双引号(“)表示。Hive 在字符串内使用 C 样式的转义。

Varchar

使用长度说明符(介于 1 和 65535 之间)创建 Varchar 类型,该说明符定义了字符串中允许的最大字符数。如果要转换/分配给 varchar 的字符串值超出了长度说明符,则该字符串将被静默截断。字符长度由字符串中包含的代码点数确定。

像字符串一样,尾随空格在 varchar 中很重要,并且会影响比较结果。

Limitations

非通用 UDF 不能直接使用 varchar 类型作为 Importing 参数或返回值。可以创建字符串 UDF,并将 varchar 值转换为字符串并传递给 UDF。若要直接使用 varchar 参数或返回 varchar 值,请创建 GenericUDF。
如果它们依赖于基于反射的方法来检索类型信息,则可能存在不支持 varchar 的其他上下文。这包括一些 SerDe 实现。

Version

Hive 0.12.0(HIVE-4844)中引入了 Varchar 数据类型。

Char

字符类型类似于 Varchar,但它们是固定长度的,这意味着比指定长度值短的值用空格填充,但在比较期间尾随空格并不重要。最大长度固定为 255.

CREATE TABLE foo (bar CHAR(10))

Version

Char 数据类型是在 Hive 0.13.0(HIVE-5191)中引入的。

Timestamps

支持传统的 UNIX 时间戳,具有可选的纳秒精度。

Supported conversions:

  • 整数数字类型:解释为 UNIX 时间戳,以秒为单位

  • 浮点数值类型:解释为 UNIX 时间戳,以秒为单位,具有十进制精度

  • 字符串:JDBC 兼容的 java.sql.Timestamp 格式“ YYYY-MM-DD HH:MM:SS.fffffffff”(小数点后 9 位精度)

时间戳被解释为无时区,并存储为与 UNIX 时期的偏移量。提供了往返时区的便利UDFs(to_utc_timestampfrom_utc_timestamp)。
所有现有的日期时间UDFs(月,日,年,小时等)都使用TIMESTAMP数据类型。

文本文件中的时间戳必须使用yyyy-mm-dd hh:mm:ss[.f...]格式。如果它们是另一种格式,则将它们声明为适当的类型(INT,FLOAT,STRING 等),然后使用 UDF 将其转换为时间戳。

在表级别,可以通过将格式提供给SerDe property“ timestamp.formats”(从带有HIVE-9298的 1.2.0 版开始)来支持其他时间戳格式。例如,yyyy-MM-dd'T'HH:mm:ss.SSS,yyyy-MM-dd'T'HH:mm:ss.

Version

Hive 0.8.0(HIVE-2272)中引入了时间戳。

Dates

DATE值以YYYY-MM-DD的形式描述特定的年/月/日。例如,DATE'2013-01-01'。日期类型没有时间部分。 Date 类型支持的值范围是 0000-01-01 至 9999-12-31,具体取决于原始 Java Date 类型的支持。

Version

日期是在 Hive 0.12.0(HIVE-4055)中引入的。

Casting Dates

日期类型只能与日期,时间戳或字符串类型之间进行转换。用户指定格式的转换记录在here中。

有效的日期类型转换Result
演员表(日期为日期)相同日期值
强制转换(以时间戳记为日期)根据本地时区确定时间戳的年/月/日,并作为日期值返回。
强制转换(日期字符串)如果字符串的格式为“ YYYY-MM-DD”,则返回对应于该年/月/日的日期值。如果字符串值与此格式不匹配,则返回 NULL。
演员表(日期为时间戳)基于本地时区,生成与日期值的年/月/日的午夜对应的时间戳值。
演员(日期为字符串)日期表示的年/月/日格式为字符串,格式为“ YYYY-MM-DD”。

Intervals

支持的间隔说明ExampleMeaningSince
时间单位间隔:

秒/分钟/天/月/年/年间隔“ 1”天间隔 1 天Hive1.2.0(HIVE-9792)。
年月间隔,格式:SY-M
S:可选符号(/-)
Y:年计数
M:月份计数
年月间隔 1-2 年简写为:
间隔“ 1”年
INTERVAL'2'MONTH
Hive 1.2.0(HIVE-9792)。
天至秒间隔,格式:SD H:M:S.nnnnnn
S:可选符号(/-)
D:天数 H:小时
M: minutes
S: seconds
nnnnnn:可选 nanotime
INTERVAL'1 2:3:4.000005'DAY简写:
间隔“ 1”天
间隔“ 2”小时
间隔'3'分钟
间隔“ 4”秒
INTERVAL'5'NANO
Hive 1.2.0(HIVE-9792)。
支持具有固定编号的间隔INTERVAL 1 DAY有助于查询的可读性/可移植性Hive 2.2.0(HIVE-13557)。
支持带表达式的间隔:
这可能涉及其他功能/列。
表达式必须以数字(不是浮点数)或字符串返回。
INTERVAL(1 dt)DAY启用动态间隔Hive 2.2.0(HIVE-13557)。
间隔关键字的可选用法

Note





强制使用 INTERVAL 关键字

> 用于带表达式的间隔(例如:INTERVAL(1 dt)SECOND)



|1 DAY

> 每月 1-2 年|间隔 1 天

> |间隔到间隔 1-2 年| Hive 2.2.0(HIVE-13557)。
|添加时间单位别名以提高可移植性/可读性:

> |秒/分钟/小时/天/周/月/年/年| 2 秒| 2 秒| Hive 2.2.0(HIVE-13557)。

Decimals

Version

小数数据类型在 Hive 0.11.0(HIVE-2693)中引入,并在 Hive 0.13.0(HIVE-3976)中进行了修订。

NUMERIC与 Hive 3.0.0(HIVE-16764)中的DECIMAL相同。

Hive 中的DECIMAL类型基于 Java 的BigDecimal,它用于表示 Java 中不可变的任意精度十进制数字。所有常规数字运算(例如-,*,/)和相关的 UDF(例如 Floor,Ceil,Round 等)都可以处理小数类型。您可以像使用其他数字类型一样强制转换为十进制类型或从十进制类型强制转换。十进制类型的持久性格式支持科学和非科学表示法。因此,无论您的数据集是否包含 4.004E 3(科学记数法)或 4004(非科学记数法)之类的数据,或两者结合使用,都可以使用DECIMAL

  • 配置单元 0.11 和 0.12 具有固定的DECIMAL类型的精度,并限制为 38 位数字。

  • 从 Hive 0.13开始,用户可以在使用DECIMAL(precision, scale)语法创建具有DECIMAL数据类型的表时指定比例和精度。如果未指定 scale,则默认为 0(无小数位)。如果未指定精度,则默认为 10.

CREATE TABLE foo (
  a DECIMAL, -- Defaults to decimal(10,0)
  b DECIMAL(9, 7)
)

有关用法,请参见下面的 Literals 部分中的浮点类型

Decimal Literals

大于 BIGINT 的整数 Literals 必须使用 Decimal(38,0)处理。需要 Postfix BD。例:

select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;

Hive 0.12.0 和 0.13.0 之间的小数类型不兼容

随着 Hive 0.13.0 中 Decimal 数据类型的更改,Hive 之前的 0.13.0 列(“ decimal”类型)将被视为类型 October(10,0)。这意味着将从这些表中读取的现有数据将被视为 10 位整数值,并且写入这些表的数据将在写入之前转换为 10 位整数值。为避免这些问题,升级到 Hive 0.13.0 或更高版本后,具有 0.12 或更早版本且包含十进制列的表的 Hive 用户将需要迁移其表。

升级 Pre-Hive 0.13.0 小数列

如果用户使用的是 Hive 0.12.0 或更早版本,并且使用十进制列创建了表,那么在升级到 Hive 0.13.0 或更高版本之后,他们应该在这些表上执行以下步骤。

  • 确定要为表格中的小数列设置的精度/小数位数。

  • 对于表中的每个小数点列,使用ALTER TABLE命令将列定义更新为所需的精度/小数位数:

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

如果该表不是分区表,那么您就完成了。如果表有分区,请 continue 执行步骤 3.

  • 如果该表是分区表,则查找该表的分区列表:
SHOW PARTITIONS foo;

ds=2008-04-08/hr=11
ds=2008-04-08/hr=12
...
  • 表中的每个现有分区还必须更改其 DECIMAL 列以添加所需的精度/小数位数。

可以使用动态分区(使用 Hive 0.14 或更高版本的 ALTER TABLE CHANGE COLUMN,使用HIVE-8411)通过单个更改表更改列完成此操作:

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 或更高版本中使用HIVE-7971可用):

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

小数数据类型将在下面的浮点类型中进一步讨论。

Union Types

UNIONTYPE support is incomplete

Hive 0.7.0(HIVE-537)中引入了 UNIONTYPE 数据类型,但是在 Hive 中对此类型的完全支持仍然不完整。在 JOIN(HIVE-2508),WHERE 和 GROUP BY 子句中引用 UNIONTYPE 字段的查询将失败,并且 Hive 没有定义语法来提取 UNIONTYPE 的标记或值字段。这意味着 UNIONTYPE 是有效的仅直通。

联合类型可以在任意一点上完全保留其指定的数据类型之一。您可以使用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}

反序列化联合的第一部分是* tag *,它使我们知道正在使用联合的哪一部分。在此示例中,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

浮点类型

浮点 Literals 被假定为 DOUBLE。尚不支持科学计数法。

Decimal Types

Version

小数数据类型在 Hive 0.11.0(HIVE-2693)中引入。请参阅上面的Decimal Datatype

NUMERIC与 Hive 3.0.0(HIVE-16764)中的DECIMAL相同。

十进制字面量提供比 DOUBLE 类型更精确的值和更大的浮点数范围。十进制数据类型存储数字值的精确表示,而 DOUBLE 数据类型存储数字值的非常接近的近似值。

对于双精度(非常接近)不足的用例,需要十进制类型,例如财务应用程序,相等性和不相等性检查以及舍入运算。处理用例的数字在 DOUBLE 范围之外(大约-10308 至 10308)或非常接近零(-10-308 至 10-308)的用例也需要它们。有关 DOUBLE 类型的限制的一般性讨论,请参见 Wikipedia 文章双精度浮点格式

在 Hive 中,小数类型的精度限制为 38 位。有关选择此限制的原因的 Comment,请参见HIVE-4271HIVE-4320

使用十进制类型

您可以使用以下语法在 Hive 中创建使用 Decimal 类型的表:

create table decimal_1 (t decimal);

decimal_1是具有一个十进制类型的字段的表,该字段基本上是十进制值。

您可以使用 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 值转换为任何其他基本类型,例如 BOOLEAN。例如:

select cast(t as boolean) from decimal_2;
Mathematical UDFs

Decimal 还支持许多arithmetic operatorsmathematical UDFsUDAFs,语法与 DOUBLE 相同。

可以使用十进制类型的基本 math 运算包括:

这些舍入函数也可以采用十进制类型:

  • Floor

  • Ceiling

  • Round

幂(decimal,n)仅支持指数 n 的正整数值。

转换十进制值

支持在十进制值和任何其他原始类型(例如,整数,双精度,Boolean 等)之间进行转换。

测试十进制类型

作为 Hive 中 TestCliDriver 框架的一部分,添加了两个新测试。它们是十进制_1.q 和十进制_2.q。其他测试(例如 udf7.q)涵盖了上述 UDF 的范围。

需要添加更多的测试来证明失败或何时阻止某些类型的强制类型转换(例如,迄今为止的强制转换)。舍入函数中存在一些歧义,因为 Decimal 的舍入不能完全按照 SQL 标准进行,因此在当前工作中已将其省略。

有关运行 Hive 测试的一般信息,请参阅如何为 Apache Hive 贡献力量Hive 开发人员常见问题解答

处理 NULL 值

缺失值由特殊值 NULL 表示。要导入带有 NULL 字段的数据,请检查表使用的 SerDe 文档。 (默认的文本格式使用 LazySimpleSerDe,在导入时,它会将字符串 N 解释为 NULL.)

Change Types

hive.metastore.disallow.incompatible.col.type.changes设置为 false 时,可以将 Metastore 中的列的类型从任何类型更改为任何其他类型。更改类型后,如果可以使用新类型正确显示数据,则将显示数据。否则,数据将显示为 NULL。

允许的隐式转换

voidbooleantinyintsmallintintbigintfloatdoubledecimalstringvarchartimestampdatebinary
void totruetruetruetruetruetruetruetruetruetruetruetruetruetrue
boolean tofalsetruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
tinyint tofalsefalsetruetruetruetruetruetruetruetruetruefalsefalsefalse
smallint tofalsefalsefalsetruetruetruetruetruetruetruetruefalsefalsefalse
int tofalsefalsefalsefalsetruetruetruetruetruetruetruefalsefalsefalse
bigint tofalsefalsefalsefalsefalsetruetruetruetruetruetruefalsefalsefalse
float tofalsefalsefalsefalsefalsefalsetruetruetruetruetruefalsefalsefalse
double tofalsefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
decimal tofalsefalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalsefalse
string tofalsefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
varchar tofalsefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
timestamp tofalsefalsefalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalse
date tofalsefalsefalsefalsefalsefalsefalsefalsefalsetruetruefalsetruefalse
binary tofalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue