日期/時間類型
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到0.13.0版本為止已經支持越來越多的數據類型,像傳統數據庫中的VCHAR、CHAR、DATE以及所特有的復合類型MAP、STRUCT等。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)語法。例如:
create table decimal_test (d decimal);
可以使用cast在DECIMAL和其它基本類型,如INT、DOUBLE、BOOLEAN之間轉換,如:
Select cast(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創建表的例子如下:
CREATE TABLE test(c CHAR(10), vc VARCHAR(30));
復合類型
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的例子如下:
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
轉自: https://blog.csdn.net/skywalker_only/article/details/27547515
