博客地址:http://www.iteblog.com/
文章標題:《Hive數據類型轉換》
本文鏈接:http://www.iteblog.com/archives/892
Hadoop、Hive、Hbase、Flume等QQ交流羣:138615359(已滿),請加入新羣:149892483
本博客的微信公共帳號爲:iteblog_hadoop,歡迎大家關注。
如果你覺得本文對你有幫助,不妨分享一次,你的每次支持,都是對我最大的鼓勵
寫在前面的話,學Hive這麼久了,發現目前國內還沒有一本完整的介紹Hive的書籍,而且互聯網上面的資料很亂,於是我決定寫一些關於《Hive的那些事》序列文章,分享給大家。我會在接下來的時間整理有關Hive的資料,如果對Hive的東西感興趣,請關注本博客。http://www.iteblog.com/archives/tag/hive的那些事
在《Hive內置數據類型》文章中,我們提到了Hive內置數據類型由基本數據類型和複雜數據類型組成。今天的話題是Hive數據類型之間的轉換。同Java語言一樣,Hive也包括隱式轉換(implicit conversions)和顯式轉換(explicitly conversions)。
Hive在需要的時候將會對numeric類型的數據進行隱式轉換。比如我們對兩個不同數據類型的數字進行比較,假如一個數據類型是INT型,另一個是SMALLINT類型,那麼SMALLINT類型的數據將會被隱式轉換地轉換爲INT類型,這個到底和Java中的一樣;但是我們不能隱式地將一個INT類型的數據轉換成SMALLINT或TINYINT類型的數據,這將會返回錯誤,除非你使用了CAST操作。
任何整數類型都可以隱式地轉換成一個範圍更大的類型。TINYINT,SMALLINT,INT,BIGINT,FLOAT和STRING都可以隱式地轉換成DOUBLE;是的你沒看出,STRING也可以隱式地轉換成DOUBLE!但是你要記住,BOOLEAN類型不能轉換爲其他任何數據類型!
下標列出了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) < 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的字符串。 |
本博客文章除特別聲明,全部都是原創!
尊重原創,轉載請註明: 轉載自過往記憶(http://www.iteblog.com/)
本文鏈接地址: 《Hive數據類型轉換》(http://www.iteblog.com/archives/892)
E-mail:[email protected]