Hive数据类型及⽂本⽂件数据编码
1. 数值型
类型⽀持范围
TINYINT1-byte signed integer, from -128 to 127
SMALLINT2-byte signed integer, from -32,768 to 32,767
INT/INTEGER4-byte signed integer, from -2,147,483,648 to 2,147,483,647
BIGINT8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT4-byte single precision floating point number
DOUBLE8-byte double precision floating point number
DOUBLE PRECISION
DECIMAL Decimal datatype was introduced in Hive 0.11.0 (HIVE-2693) and revised in Hive 0.13.0 (HIVE-3976)
1. Integral Types (TINYINT, SMALLINT, INT/INTEGER, BIGINT)
默认情况下,整数型为INT型,当数字⼤于INT型的范围时,会⾃动解释执⾏为BIGINT,或者使⽤以下后缀进⾏说明。
类型后缀例⼦
TINYINT Y100Y
SMALLINT S100S
BIGINT L100L
INTEGER is introduced as a synonym for INT in Hive 2.2.0 (HIVE-14950).
2. Decimals
Hive的⼩数型是基于Java BigDecimal做的, BigDecimal在java中⽤于表⽰任意精度的⼩数类型。所有常规数字运算(例如+, -
,*,/)和相关的UDFs(例如Floor,Ceil,Round等等)都使⽤和⽀持Decimal。你可以将Decimal和
其他数值型互相转换,且Decimal ⽀持科学计数法和⾮科学计数法。因此,⽆论您的数据集是否包含如4.004E + 3(科学记数法)或4004(⾮科学记数法)或两者的组合的数据,可以使⽤Decimal。
从Hive 0.13开始,⽤户可以使⽤DECIMAL(precision, scale) 语法在创建表时来定义Decimal数据类型的precision和scale。 如果未指定precision,则默认为10。如果未指定scale,它将默认为0(⽆⼩数位)。
CREATE TABLE foo (
a DECIMAL, – Defaults to decimal(10,0)
b DECIMAL(9, 7)
)
⼤于BIGINT的数值,需要使⽤BD后缀以及Decimal(38,0)来处理,例:
select CAST(18446744073709001000BD AS DECIMAL(38,0)) from my_table limit 1;
Decimal在Hive 0.12.0 and 0.13.0之间是不兼容的,故0.12前的版本需要迁移才可继续使⽤,具体情况参见官⽹。
2. ⽇期型
类型⽀持版本
TIMESTAMP Note: Only available starting with Hive 0.8.0
DATE Note: Only available starting with Hive 0.12.0
INTERVAL Note: Only available starting with Hive 1.2.0
类型⽀持版本
1. Timestamps
⽀持传统的UNIX时间戳和可选的纳秒精度。
- ⽀持的转化:
- 整数数字类型:以秒为单位解释为UNIX时间戳
- 浮点数值类型:以秒为单位解释为UNIX时间戳,带⼩数精度
-
字符串:符合JDBC java.sql.Timestamp格式“YYYY-MM-DD HH:MM:SS.fffffffff”(9位⼩数位精度)
时间戳被解释为⽆时间的,并被存储为从Unix纪元的偏移量。 提供了⽤于转换到和从时区转换的便捷
UDFs(to_utc_timestamp,from_utc_timestamp)。
所有现有的⽇期时间UDFs(⽉,⽇,年,⼩时等)都使⽤TIMESTAMP数据类型。
Text files中的时间戳必须使⽤格式yyyy-mm-dd hh:mm:ss [.f …]。 如果它们是另⼀种格式,请将它们声明为适当的类型
(INT,FLOAT,STRING等),并使⽤UDF将它们转换为时间戳。
在表级别上,可以通过向SerDe属性”timestamp.formats”(⾃版本1.2.0 with HIVE-9298)提供格式来⽀持备选时间戳格式。 例如,yyyy-MM-dd’T’HH:mm:ss.SSS,yyyy-MM-dd’T’HH:mm:ss。
2. Dates
DATE值描述特定的年/⽉/⽇,格式为YYYY-MM-DD。 例如,DATE’2013-01-01’。 ⽇期类型没有时间组件。 Date类型⽀持的值范围是0000-01-01到9999-12-31,这取决于Java Date类型的原始⽀持。
Date types只能在Date, Timestamp, or String types之间转换。
转换类型结果
cast(date as
date)
Same date value
cast(date as
string)
The year/month/day represented by the Date is formatted as a string in the form ‘YYYY-MM-DD’.
cast(date as timestamp)A timestamp value is generated corresponding to midnight of the year/month/day of the date value, based on the local timezone.
cast(string as date)If the string is in the form ‘YYYY-MM-DD’, then a date value corresponding to that year/month/day is returned. If the string value does not match this formate, then NULL is returned.
cast(timestamp
as date)
The year/month/day of the timestamp is determined, based on the local timezone, and returned as a date value.
3. Intervals
时间间隔在1.2.0之后版本⽀持,在2.2.0版本上进⾏了扩展,具体情况参见官⽹。
3. 字符型
1.Strings
字符串⽂字可以⽤单引号(’)或双引号(“)表⽰。Hive在字符串中使⽤C风格的转义。
2. Varchar
Varchar类型使⽤长度说明符(介于1和65355之间)创建,它定义字符串中允许的最⼤字符数。 如果要转换/分配给varchar值的字符串值超过length说明符,则字符串将被静默截断。 字符长度由字符串包
含的代码点的数量确定。
像字符串⼀样,尾部空格在varchar中很重要,并且会影响⽐较结果。
⾮通⽤UDFs不能直接使⽤varchar类型作为输⼊参数或返回值。 可以创建字符串UDFs,⽽varchar值将被转换为strings并传递到UDF。要直接使⽤varchar参数或返回varchar值,请创建GenericUDF。
如果基于reflection-based⽅法来获取数据类型信息,则可能存在不⽀持varchar的场景。 这包括⼀些SerDe函数实现。
3. Char
字符类型与Varchar类似,但它们是固定长度的,意味着⽐指定长度值短的值⽤空格填充,但尾随空格在⽐较期间不重要。 最⼤长度固定为255。
CREATE TABLE foo (bar CHAR(10))
4. 其他
1. BOOLEAN
2. BINARY (Note: Only available starting with Hive 0.8.0)
5. 复杂类型(集合数据类型)
类型⽀持版本
arrays ARRAY(data_type)Note: negative values and non-constant expressions are allowed as of Hive 0.14.
bigdecimal转换为integermaps MAP(primitive_type, data_type)Note: negative values and non-constant expressions are allowed as of Hive 0.14.
structs STRUCTcol_name : data_type [COMMENT col_comment], …)
union UNIONTYPE(data_type, data_type, …)Note: Only available starting with Hive 0.7.0.
复杂类型包括ARRAY,MAP,STRUCT,UNION,这些复杂类型是由基础类型组成的。
  ARRAY:ARRAY类型是由⼀系列相同数据类型的元素组成,这些元素可以通过下标来访问。⽐如有⼀个ARRAY类型的变量fruits,它是由['apple','orange','mango']组成,那么我们可以通过fruits[1]来访问元素orange,因为ARRAY类型的下标是从0开始的;
  MAP:MAP包含key->value键值对,可以通过key来访问元素。⽐如”userlist”是⼀个map类型,其中username是
key,password是value;那么我们可以通过userlist['username']来得到这个⽤户对应的password;
  STRUCT:STRUCT可以包含不同数据类型的元素。这些元素可以通过”点语法”的⽅式来得到所需要的元素,⽐如user是⼀个STRUCT类型,那么可以通过user.address得到这个⽤户的地址。
  UNION: UNIONTYPE,他是从Hive 0.7.0开始⽀持的。
⽰例:⼀张虚构的⼈⼒资源应⽤程序中的员⼯表:
CREATE TABLE employees (
name    STIRNG,
salary    FLOAT,
subordinates ARRAY<STRING>,
deductions    MAP<STRING, FLOAT>,
address          STRUCT<street:STRING, city:STRING,state:STRING,zip:INT>);
说明:
subordinates 下属员⼯,是个数组,
deductions 扣除额:是⼀个map,记录每次的扣除额
address:雇员地址,使⽤struct数据类型存储,其中每个城都被作了命名,并且具有⼀个特定类型。
,类似如:ARRAY<STRUCT>表⽰数组中的每个元素都是STRUCT结构。
⽂本⽂件数据编码
hive书⽤⼏个很少出现在字段值中的控制字符,使⽤术语field来表⽰替换默认分隔符的字符
常使⽤分隔符
分隔符名称说明
\n换⾏符对于⽂本⽂件⽽⾔,每⼀⾏是⼀条记录,因此换⾏符可以分割数据。
^A<Ctrl>+A常⽤于分隔列,在CREATE TABLE语句中可以使⽤⼋进制编码\001表⽰。
^B<Ctrl>+B常⽤于分隔ARRAY与STRUCT元素,或⽤于MAP中键值对之间的分隔。CREATE TABLE语句中可以使⽤⼋进制编码\002表⽰^C<Ctrl+C>MAP中键值对的分隔。
\t制表符常⽤
,逗号常⽤
在使⽤的过程中,可以不使⽤Hive提供的默认分隔符,⽽使⽤其他的分隔符。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。