数字类
类型 | 长度 | 备注 |
---|---|---|
TINYINT | 1字节 | 有符号整型 |
SMALLINT | 2字节 | 有符号整型 |
INT | 4字节 | 有符号整型 |
BIGINT | 8字节 | 有符号整型 |
FLOAT | 4字节 | 有符号单精度浮点数 |
DOUBLE | 8字节 | 有符号双精度浮点数 |
DECIMAL | -- | 可带小数的精确数字字符串 |
日期时间类
类型 | 长度 | 备注 |
---|---|---|
TIMESTAMP | -- | 时间戳,内容格式:yyyy-mm-dd hh:mm:ss[.f...] |
DATE | -- | 日期,内容格式:YYYYMMDD |
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