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 '\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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM