數字類
類型 | 長度 | 備注 |
---|---|---|
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 '\n'
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