1. 程式人生 > >Hive學習之Hive資料型別

Hive學習之Hive資料型別

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)語法。例如:

[sql] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. createtable decimal_test (d decimal);  

        可以使用LazySimpleSerDe和LazyBinarySerDe讀寫包含DECIMAL型別的表,如:

[sql] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. altertable decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';  
  2. altertable decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazyBinarySerDe';  

        可以使用cast在DECIMAL和其它基本型別,如INT、DOUBLE、BOOLEAN之間轉換,如:

[sql] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. 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?在CODE上檢視程式碼片派生到我的程式碼片
  1. 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支援的型別轉換為:

  1.   整數型別:轉換為秒級的UNIX時間戳。
  2.   浮點數型別:轉換為帶小數精度的UNIX時間戳。
  3.   字串型別:適合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種複合資料型別,分別為:

  1.   Array:ARRAY<data_type>
  2.   Map:MAP<primitive_type, data_type>
  3.   Struct: STRUCT<col_name : data_type [COMMENT col_comment], ...>
  4.   Union:UNIONTYPE<data_type, data_type, ...>

        UNIONTYPE型別可以在任何一個點精確地持有它所指定資料型別的一種,使用UNIONTYPE的例子如下:

[sql] view plain copy print?在CODE上檢視程式碼片派生到我的程式碼片
  1. CREATE TABLEunion_test(u UNIONTYPE<intdouble, array<string>,struct<a:int,b:string>>);  
  2. SELECT u FROMunion_test;  
  3. {0:1}  
  4. {1:2.0}  
  5. {2:["three","four"]}  
  6. {3:{"a":5,"b":"five"}}  
  7. {2:["six","seven"]}  
  8. {3:{"a":8,"b":"eight"}}  
  9. {0:9}  
  10. {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