Hive 變量類型

本文大部分轉至:http://blog.csdn.net/skywalker_only/article/details/27547515java

Hive到0.13.0版本爲止已經支持愈來愈多的數據類型,像傳統數據庫中的VCHAR、CHAR、DATE以及所特有的複合類型MAP、STRUCT等。hive中的數據類型能夠分爲數值類型、字符串類型、日期時間類型、複合類型以及其它類型,下面分別予以介紹。mysql

數值類型

        Hive中的數值類型與Java中的數值類型很類似,區別在於有些類型的名稱不同,能夠歸納爲以下的表格:
sql

默認狀況下,整數常量被當作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爲其它數值類型或者將其它基本類型轉換爲DECIMALDECIMAL類型支持科學計數法,因此無論數據集中是否包含1E+44或者4000或者兩者的組合,均可以使用DECIMAL表示。Hive-0.11.0和Hive-0.12.0固定了DECIMAL類型的精度並限制爲38位數字,從Hive-0.13.0開始能夠指定DECIMAL的規模和精度,當使用DECIMAL類型建立表時可使用DECIMAL(precision,scale)語法。例如:apache

create table decimal_test (d decimal);

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

alter table decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe';  
alter table decimal_1 set serde 'org.apache.hadoop.hive.serde2.lazy.LazyBinarySerDe';

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

Select cast(d asboolean) from decimal_test;

DECIMAL類型比DOUBLE類型爲浮點數提供了精確的數值和更廣的範圍DECIMAL類型存儲了數值的精確地表示,而DOUBLE類型存儲了很是接近數值的近似值當DOUBLE類型的近似值精度不夠時可使用DECIMAL類型,好比金融應用,等於和不等於檢查以及舍入操做,當數值超出了DOUBLE類型的範圍(大約-10308 to 10308)或者很是接近於0(-10-308 to 10-308)時,也可使用DECIMAL類型。.net

 

字符串類型

        字符串常量使用單引號或者雙引號表示,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建立表的例子以下:code

CREATE TABLE test(c CHAR(10), vc VARCHAR(30));

 

日期/時間類型

 Hive支持帶可選的納秒級精度的UNIX timestamp。Hive中的timestamp與時區無關,存儲爲UNIX紀元的偏移量。Hive提供了用於timestamp和時區相互轉換的便利UDF:orm

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-­31DATE類型僅可與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'格式的字符串。

 實際操做:

create table bi.Etest01 
( a Date,
 b string,
 c timestamp
)
row format delimited
fields terminated by ','
;

在往這個被建立的表中insert 日期類型的數據時,發現,a只能接收'yyyy-mm-dd'類型的值,不然爲NULL,

b能夠接收任意類型的值,c只能接收'yyyy-mm-dd hh:mm:ss....'類型的值,不然爲NULL.

 

複雜數據類型

Hive 有三種複雜數據類型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 與 Java 中的 Array 和 Map 相似,而STRUCT 與 C語言中的 Struct 相似,它封裝了一個命名字段集合,複雜數據類型容許任意層次的嵌套。

   複雜數據類型的聲明必須使用尖括號指明其中數據字段的類型。定義三列,每列對應一種複雜的數據類型,以下所示。

CREATE TABLE complex(
    col1 ARRAY< INT>,
    col2 MAP< STRING,INT>,
    col3 STRUCT< a:STRING,b:INT,c:DOUBLE>
)

Structs: Structs內部的數據能夠經過逗號(.)來存取,例如,表中某列a1的類型爲Struct{b int; c int},咱們能夠經過a1.b來訪問域b;

Map(K-V對):訪問指定域能夠經過{"指定域名稱"}進行,例如,一個Map A包含了一個group->gid的KV對,gid的值能夠經過A['group']來獲取;

Arrays:array的數據爲相同類型,例如,假如array A 中元素['a','b','c'],則A[1]的值爲'b';

 

類型轉化

   Hive 的原子數據類型是能夠進行隱式轉換的,相似於 Java 的類型轉換,例如某表達式使用 INT 類型,TINYINT 會自動轉換爲 INT 類型, 可是 Hive 不會進行反向轉化,例如,某表達式使用 TINYINT 類型,INT 不會自動轉換爲 TINYINT 類型,它會返回錯誤,除非使用 CAST 操做。

隱式類型轉換規則以下:

一、任何整數類型均可以隱式地轉換爲一個範圍更廣的類型,如 TINYINT 能夠轉換成 INT,INT 能夠轉換成 BIGINT。

二、全部整數類型、FLOAT 和 String 類型均可以隱式地轉換成 DOUBLE。

三、TINYINT、SMALLINT、INT 均可以轉換爲 FLOAT。

四、BOOLEAN 類型不能夠轉換爲任何其它的類型。

可使用 CAST 操做顯示進行數據類型轉換,例如 CAST(‘1’ AS INT) 將把字符串’1’ 轉換成整數 1;若是強制類型轉換失敗,如執行 CAST(‘X’ AS INT),表達式返回空值 NULL。 

相關文章
相關標籤/搜索