Hive數據類型轉換
07-17
寫在前面的話,學Hive這麼久了,發現目前國內還沒有一本完整的介紹Hive的書籍,而且互聯網上面的資料很亂,於是我決定寫一些關於《Hive的那些事》序列文章,分享給大家。我會在接下來的時間整理有關Hive的資料,如果對Hive的東西感興趣,請關注本博客。https://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內置的數據類型之間是否可以進行隱式的轉換操作:bltinyintsiintbigintfloatdoubledmstringvctsdatebabooleantruefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetinyintfalsetruetruetruetruetruetruetruetruetruefalsefalsefalsesmallintfalsefalsetruetruetruetruetruetruetruetruefalsefalsefalseintfalsefalsefalsetruetruetruetruetruetruetruefalsefalsefalsebigintfalsefalsefalsefalsetruetruetruetruetruetruefalsefalsefalsefloatfalsefalsefalsefalsefalsetruetruetruetruetruefalsefalsefalsedoublefalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalsedecimalfalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalsefalsestringfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalsevarcharfalsefalsefalsefalsefalsefalsetruetruetruetruefalsefalsefalsetsfalsefalsefalsefalsefalsefalsefalsefalsetruetruetruefalsefalsedatefalsefalsefalsefalsefalsefalsefalsefalsetruetruefalsetruefalsebinaryfalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsefalsetrue註:由於表格比較大,這裡對一些比較長的字元串進行縮寫,ts是timestamp的縮寫,bl是boolean的縮寫,sl是smallint的縮寫,dm是decimal的縮寫,vc是varchar的縮寫,ba是binary的縮寫。我們可以用CAST來顯式的將一個類型的數據轉換成另一個數據類型。如何使用?CAST的語法為cast(value AS TYPE)。舉個例子:假如我們一個員工表employees,其中有name、salary等欄位;salary是字元串類型的。有如下的查詢:SELECT name, salary FROM employeesWHERE cast(salary AS FLOAT) < 100000.0;這樣salary將會顯示的轉換成float。如果salary是不能轉換成float,這時候cast將會返回NULL!對cast有一下幾點需要說明的:如果將浮點型的數據轉換成int類型的,內部操作是通過round()或者floor()函數來實現的,而不是通過cast實現!對於BINARY類型的數據,只能將BINARY類型的數據轉換成STRING類型。如果你確信BINARY類型數據是一個數字類型(a number),這時候你可以利用嵌套的cast操作,比如a是一個BINARY,且它是一個數字類型,那麼你可以用下面的查詢:SELECT (cast(cast(a as string) as double)) from src;我們也可以將一個String類型的數據轉換成BINARY類型。對於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的字元串。本博客文章除特別聲明,全部都是原創!
推薦閱讀:
推薦閱讀:
※關於Long long int, long int ,int 和short int的長度大小區分
※【乾貨合集】看完這些乾貨,再說你因為「怕蛇」,所以學不好 Python!
※Jupyter Notebook數據科學高效技巧