http://blog.csdn.net/yimingsilence/article/details/70057638
數據類型轉換
同Java語言一樣,Hive也包括 隱式轉換(implicit conversions)和顯式轉換(explicitly conversions)。
Hive在需要的時候將會對numeric類型的數據進行隱式轉換。比如我們對兩個不同數據類型的數字進行比較,假如一個數據類型是INT型,另一個 是SMALLINT類型,那么SMALLINT類型的數據將會被隱式轉換地轉換為INT類型,這個到底和Java中的一樣;但是我們不能隱式地將一個 INT類型的數據轉換成SMALLINT或TINYINT類型的數據,這將會返回錯誤,除非你使用了CAST操作。
下標列出了Hive內置的數據類型之間是否可以進行隱式的轉換操作:
bl | tinyint | si | int | bigint | float | double | dm | string | vc | ts | date | ba | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
boolean | true | false | false | false | false | false | false | false | false | false | false | false | false |
tinyint | false | true | true | true | true | true | true | true | true | true | false | false | false |
smallint | false | false | true | true | true | true | true | true | true | true | false | false | false |
int | false | false | false | true | true | true | true | true | true | true | false | false | false |
bigint | false | false | false | false | true | true | true | true | true | true | false | false | false |
float | false | false | false | false | false | true | true | true | true | true | false | false | false |
double | false | false | false | false | false | false | true | true | true | true | false | false | false |
decimal | false | false | false | false | false | false | false | true | true | true | false | false | false |
string | false | false | false | false | false | false | true | true | true | true | false | false | false |
varchar | false | false | false | false | false | false | true | true | true | true | false | false | false |
ts | false | false | false | false | false | false | false | false | true | true | true | false | false |
date | false | false | false | false | false | false | false | false | true | true | false | true | false |
binary | false | false | false | false | false | false | false | false | false | false | false | false | true |
注:由於表格比較大,這里對一些比較長的字符串進行縮寫,ts是timestamp的縮寫,bl是boolean的縮寫,sl是smallint的縮寫,dm是decimal的縮寫,vc是varchar的縮寫,ba是binary的縮寫。
我們可以用CAST來顯式的將一個類型的數據轉換成另一個數據類型。如何使用?CAST的語法為cast(value AS TYPE)。舉個例子:假如我們一個員工表employees,其中有name、salary等字段;salary是字符串類型的。有如下的查詢:
1 |
SELECT name, salary FROM employees |
2 |
WHERE cast(salary AS FLOAT) <</code> 100000.0; |
這樣salary將會顯示的轉換成float。如果salary是不能轉換成float,這時候cast將會返回NULL!
對cast有一下幾點需要說明的:
(1)、如果將浮點型的數據轉換成int類型的,內部操作是通過round()或者floor()函數來實現的,而不是通過cast實現!
(2)、對於BINARY類型的數據,只能將BINARY類型的數據轉換成STRING類型。如果你確信BINARY類型數據是一個數字類型(a number),這時候你可以利用嵌套的cast操作,比如a是一個BINARY,且它是一個數字類型,那么你可以用下面的查詢:
1 |
SELECT (cast(cast(a as string) as double )) from src; |
我們也可以將一個String類型的數據轉換成BINARY類型。
(3)、對於Date類型的數據,只能在Date、Timestamp以及String之間進行轉換。下表將進行詳細的說明
有效的轉換 | 結果 |
cast(date as date) | 返回date類型 |
cast(timestamp as date) | timestamp中的年/月/日的值是依賴與當地的時區,結果返回date類型 |
cast(string as date) | 如果string是YYYY-MM-DD格式的,則相應的年/月/日的date類型的數據將會返回;但如果string不是YYYY-MM-DD格式的,結果則會返回NULL。 |
cast(date as timestamp) | 基於當地的時區,生成一個對應date的年/月/日的時間戳值 |
cast(date as string) | date所代表的年/月/日時間將會轉換成YYYY-MM-DD的字符串。 |