hive數據類型轉換

博客地址:
文章標題:
本文鏈接:
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內置的數據類型之間是否可以進行隱式的轉換操作:


bltinyintsiintbigintfloatdoubledmstringvctsdateba
booleantruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalse
tinyintfalsetruetruetruetruetruetruetruetruetruefalsefalsefalse
smallintfalsefalsetruetruetruetruetruetruetruetruefalsefalsefalse
intfalsefalsefalsetruetruetruetruetruetruetruefalsefalsefalse
bigintfalsefalsefalsefalsetruetruetruetruetruetruefalsefalsefalse
floatfalsefalsefalsefalsefalsetruetruetruetruetruefalsefalsefalse
doublefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
decimalfalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalsefalse
stringfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
varcharfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalse
tsfalsefalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalse
datefalsefalsefalsefalsefalsefalsefalsefalsetruetruefalsetruefalse
binaryfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue

  注:由於表格比較大,這裏對一些比較長的字符串進行縮寫,ts是timestamp的縮寫,bl是boolean的縮寫,sl是smallint的縮寫,dm是decimal的縮寫,vc是varchar的縮寫,ba是binary的縮寫。

  我們可以用CAST來顯式的將一個類型的數據轉換成另一個數據類型。如何使用?CAST的語法爲cast(value AS TYPE)。舉個例子:假如我們一個員工表employees,其中有name、salary等字段;salary是字符串類型的。有如下的查詢:

1SELECT name, salary FROM employees
2WHERE 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,且它是一個數字類型,那麼你可以用下面的查詢:

1SELECT (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]    


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章