Hive學習之Hive資料型別
數值型別
Hive中的數值型別與Java中的數值型別很相似,區別在於有些型別的名稱不一樣,可以概括為如下的表格:
型別名稱 |
大小 |
最小值 |
最大值 |
示例 |
TINYINT |
1位元組 |
-128 |
127 |
45Y |
SMALLINT |
2位元組 |
-32768 |
32767 |
100S |
INT |
4位元組 |
-2,147,483,648 |
2,147,483,647 |
36 |
BIGINT |
8位元組 |
-9,223,372,036,854,775,808 |
9,223,372,036,854,775,807 |
2000L |
FLOAT |
4位元組 |
-- |
--- |
4位元組單精度 |
DOUBLE |
8位元組 |
-- |
-- |
8位元組雙精度 |
DECIMAL |
-- |
-- |
-- |
DECIMAL(9, 7) |
預設情況下,整數常量被當做INT處理,除非整數常量超出了INT型別的取值範圍或者在整數常量跟著Y、S、L等字尾,則常量將會作為TINYINT、SMALLINT和BIGINT處理。Hive中的浮點數常量預設被當做DOUBLE型別。
DECIMAL型別是在Hive-0.11.0版本中引入的,在Hive-0.13.0版本中做了改進。Hive中的DECIMAL基於Java中的BigDecimal,BigDecimal用於表示任意精度的不可修改的十進位制數字。所有常規數字操作符(如+、-、*、/)和相關的UDFs(如Floor、Ceil、Round等)用於處理DECIMAL型別,可以轉換DECIMAL為其它數值型別或者將其它基本型別轉換為DECIMAL。DECIMAL型別支援科學計數法,所以不管資料集中是否包含1E+44或者4000或者二者的組合,都可以使用DECIMAL表示。Hive-0.11.0和Hive-0.12.0固定了DECIMAL型別的精度並限制為38位數字,從Hive-0.13.0開始可以指定DECIMAL的規模和精度,當使用DECIMAL型別建立表時可以使用DECIMAL(precision,scale)語法。例如:
- createtable decimal_test (d decimal);
可以使用LazySimpleSerDe和LazyBinarySerDe讀寫包含DECIMAL型別的表,如:
[sql] view plain copy print?- altertable decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';
- altertable decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazyBinarySerDe';
可以使用cast在DECIMAL和其它基本型別,如INT、DOUBLE、BOOLEAN之間轉換,如:
[sql] view plain copy print?- Selectcast(d asboolean) from decimal_test;
DECIMAL型別比DOUBLE型別為浮點數提供了精確的數值和更廣的範圍,DECIMAL型別儲存了數值的精確地表示,而DOUBLE型別儲存了非常接近數值的近似值。當DOUBLE型別的近似值精度不夠時可以使用DECIMAL型別,比如金融應用,等於和不等於檢查以及舍入操作,當數值超出了DOUBLE型別的範圍(大約-10308 to 10308)或者非常接近於0(-10-308 to 10-308)時,也可以使用DECIMAL型別。
字串型別
字串常量使用單引號或者雙引號表示,Hive使用C語言風格對字串進行轉義。Hive-0.12.0版本引入了VARCHAR型別,VARCHAR型別使用長度指示器(1到65355)建立,長度指示器定義了在字串中允許的最大字元數量。如果一個字串值轉換為或者被賦予一個varchar值,其長度超過了長度指示器則該字串值會自動被截斷。目前還沒有通用的UDF可以直接用於VARCHAR型別,可以使用String UDF代替,VARCHAR將會轉換為String再傳遞給UDF。Hive-0.13.0版本引入了CHAR型別,CHAR型別與VARCHAR型別相似,但擁有固定的長度,也就是如果字串長度小於指示器的長度則使用空格填充。CHAR型別的最大長度為255。使用VARCHAR、CHAR建立表的例子如下:
[sql] view plain copy print?- CREATETABLE test(c CHAR(10), vc VARCHAR(30));
日期/時間型別
Hive支援帶可選的納秒級精度的UNIX timestamp。Hive中的timestamp與時區無關,儲存為UNIX紀元的偏移量。Hive提供了用於timestamp和時區相互轉換的便利UDF:to_utc_timestamp和 from_utc_timestamp。Timestamp型別可以使用所有的日期時間UDF,如month、day、year等。文字檔案中的Timestamp必須使用yyyy-mm-dd hh:mm:ss[.f...]的格式,如果使用其它格式,將它們宣告為合適的型別(INT、FLOAT、STRING等)並使用UDF將它們轉換為Timestamp。Timestamp支援的型別轉換為:
- 整數型別:轉換為秒級的UNIX時間戳。
- 浮點數型別:轉換為帶小數精度的UNIX時間戳。
- 字串型別:適合java.sql.Timestamp格式"YYYY-MM-DD HH:MM:SS.fffffffff"(9位小數精度)。
Hive中DATE型別的值描述了特定的年月日,以YYYY-MM-DD格式表示,例如2014-05-29。DATE型別不包含時間,所表示日期的範圍為0000-01-01 to 9999-12-31。DATE型別僅可與DATE、TIMESTAMP、STRING型別相互轉化,如下表所示:
型別轉換 |
結果 |
cast(date as date) |
相同的日期。 |
cast(timestamp as date) |
基於本地時區確定timestamp的年月日作為值返回。 |
cast(string as date) |
如果字串的格式為'YYYY-MM-DD', 則對應的年月日返回。如果字串不是該格式,則返回NULL。 |
cast(date as timestamp) |
基於本地時區,返回日期對應午夜時間。 |
cast(date as string) |
日期被轉換為'YYYY-MM-DD'格式的字串。 |
複合型別
Hive支援4種複合資料型別,分別為:
- Array:ARRAY<data_type>
- Map:MAP<primitive_type, data_type>
- Struct: STRUCT<col_name : data_type [COMMENT col_comment], ...>
- Union:UNIONTYPE<data_type, data_type, ...>
UNIONTYPE型別可以在任何一個點精確地持有它所指定資料型別的一種,使用UNIONTYPE的例子如下:
[sql] view plain copy print?- CREATE TABLEunion_test(u UNIONTYPE<int, double, array<string>,struct<a:int,b:string>>);
- SELECT u FROMunion_test;
- {0:1}
- {1:2.0}
- {2:["three","four"]}
- {3:{"a":5,"b":"five"}}
- {2:["six","seven"]}
- {3:{"a":8,"b":"eight"}}
- {0:9}
- {1:10.0}
在該例子中,union包含四種類型,分別為int、double、array和struct。從查詢結果來看,第一個冒號前面的數字tag代表union中某種資料型別,比如0代表union的第一個資料型別int,1代表第二個資料型別double,2代表第三個資料型別array,3代表第四個資料型別struct。
可以使用create_union UDF建立該型別,在使用該UDF時必須將數字tag傳遞給該函式。
其它型別
Hive支援的其它型別有BOOLEAN和BINARY>。
resource:http://blog.csdn.net/skywalker_only/article/details/27547515