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操做。spa
下標列出了Hive內置的數據類型之間是否能夠進行隱式的轉換操做:.net
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的縮寫。code
咱們能夠用CAST來顯式的將一個類型的數據轉換成另外一個數據類型。如何使用?CAST的語法爲cast(value AS TYPE)。舉個例子:假如咱們一個員工表employees,其中有name、salary等字段;salary是字符串類型的。有以下的查詢:blog
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,且它是一個數字類型,那麼你能夠用下面的查詢:ci
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的字符串。 |