Hive之数据类型

数字类

类型 长度 备注
TINYINT 1字节 有符号整型
SMALLINT 2字节 有符号整型
INT 4字节 有符号整型
BIGINT 8字节 有符号整型
FLOAT 4字节 有符号单精度浮点数
DOUBLE 8字节 有符号双精度浮点数
DECIMAL -- 可带小数的精确数字字符串

日期时间类

类型 长度 备注
TIMESTAMP -- 时间戳,内容格式:yyyy-mm-dd hh:mm:ss[.f...]
DATE -- 日期,内容格式:YYYY­MM­DD
INTERVAL -- --

字符串类

类型 长度 备注
STRING -- 字符串
VARCHAR 字符数范围1 - 65535 长度不定字符串
CHAR 最大的字符数:255 长度固定字符串

Misc类

类型 长度 备注
BOOLEAN -- 布尔类型 TRUE/FALSE
BINARY -- 字节序列

复合类

类型 长度 备注
ARRAY -- 包含同类型元素的数组,索引从0开始 ARRAY<data_type>
MAP -- 字典 MAP<primitive_type, data_type>
STRUCT -- 结构体 STRUCT<col_name : data_type [COMMENT col_comment], ...>
UNIONTYPE -- 联合体 UNIONTYPE<data_type, data_type, ...>

uniontype实践

  • uniontype可以理解为泛型
  • 同一时刻同一地点只有联合体中的一个元素生效
  • uniontype中的元素共享内存
  • 可以通过create_union内置函数创建uniontype:create_union(tag, val1, val2) tag是数字,0开始,必须小于后面参数的个数
  • 插入uniontype数据,通过这种方式只能插入只有一个元素的uniontype,包含多个会提示跟表中的字段类型不一致,这个是坑的地方
CREATE TABLE union_test3(foo UNIONTYPE<map<string, string>>)

insert into table union_test3 select * from (select create_union(0,map('name', 'tom', 'name2', 'wadeyu')))t;
  • 默认tag和数据使用B分隔,列数据使用C分隔,map中key和value使用D分隔(B ascii码 2,^C ascii码 3,^D ascii码 4,分隔符是通过vim查看到的【vim中输入这些特殊字符 ctrl + v + 相应的字母】)
  • 在uniontype字段中自定义分隔符的含义变了
分隔代码 含义
collection items terminated by ',' tag和数据之间使用英文逗号分隔
map keys terminated by ':' 复合类型数据元素之间使用英文冒号分隔
-- map中的key和value暂时没找到可以配置的代码
  • 操作
# 创建表
create table union_testnew(
  foo uniontype<int, double, string, array<string>, map<string, string>>
)
row format delimited
collection items terminated by ','
map keys terminated by ':'
lines terminated by '
'
stored as textfile;

# 数据准备
[root@master wadeyu]# vim union_test.log 
  1 0,1
  2 1,3.0
  3 2,world
  4 3,wade:tom:polly
  5 4,k1^Dv1:k2^Dv2
  
# 导入数据
hive (badou)> load data local inpath './union_test.log' overwrite into table union_testnew;

# 查询数据
hive (badou)> select * from union_testnew;
OK
union_testnew.foo
{0:1}
{1:3.0}
{2:"world"}
{3:["wade","tom","polly"]}
{4:{"k1":"v1","k2":"v2"}}
Time taken: 0.225 seconds, Fetched: 5 row(s)
  • 碰到的问题 原因:数据格式没有按照要求
18/10/11 19:06:24 [main]: WARN thrift.ThriftCLIService: Error fetching results: 
org.apache.hive.service.cli.HiveSQLException: java.io.IOException: org.apache.hadoop.hive.ql.metadata.HiveException: java.lang.NumberFormatException: Empty string!
	at org.apache.hive.service.cli.operation.SQLOperation.getNextRowSet(SQLOperation.java:352)
	at org.apache.hive.service.cli.operation.OperationManager.getOperationNextRowSet(OperationManager.java:220)
	at org.apache.hive.service.cli.session.HiveSessionImpl.fetchResults(HiveSessionImpl.java:685)
	at org.apache.hive.service.cli.CLIService.fetchResults(CLIService.java:455)
	at org.apache.hive.service.cli.thrift.ThriftCLIService.FetchResults(ThriftCLIService.java:674)

参考资料

【0】 Hive wiki - Tutorial
https://cwiki.apache.org/confluence/display/Hive/Tutorial

【1】 Hive wiki - LanguageManual Types
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types

【2】特殊字符C(ETX)、B(STX)
https://blog.csdn.net/liluotuo/article/details/43984071

【3】详解hive的列分隔符和行分隔符的使用
https://blog.csdn.net/qq_26442553/article/details/80297028

【4】ASCII码表
https://baike.baidu.com/item/ASCII/309296

【5】HIVE Row Formats&SerDe(五)
https://blog.csdn.net/mhtian2015/article/details/78899171

原文地址:https://www.cnblogs.com/wadeyu/p/9784590.html