SQL數據類型規則<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#sql-data-type-rules" title="">
適用於:磚的SQL磚運行時
磚使用一些規則來解決衝突的數據類型包括:
促銷活動安全擴展更廣泛的一種類型。
隱式向下類型轉換縮小一個類型。相反的推廣。
隱式crosscasting將一種類型轉換為另一種類型的家庭的一種。
你也可以顯式地趕在許多類型:
類型轉換函數大多數類型之間的轉換,如果不能返回錯誤。
try_cast函數就像<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/cast.html">類型轉換函數但通過無效值時返回NULL。
其他<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/sql-ref-functions-builtin.html">內裝式功能使用規定格式指令類型之間進行轉換。
促銷類型<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-promotion" title="">
類型促進鑄造的過程是一個類型到另一個類型相同類型的家庭它包含所有可能的值的原始類型。因此,促銷是一個安全的操作類型。例如非常小的整數
有一個從-128年
來127年
。可以安全地提升為其所有可能的值整數
。
類型優先級列表<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list" title="">
的<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表定義的值是否一個給定的數據類型可以隱式地提升到另一個數據類型。
數據類型 |
優先級列表(從窄到寬) |
---|---|
非常小的整數- > SMALLINT - > INT - > BIGINT - >十進製- >浮動<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
SMALLINT - > INT - > BIGINT - >十進製- >浮動<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
INT - > BIGINT - >十進製- >浮動<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
長整型數字小數點- > - >浮動<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
小數- >浮點數<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
浮動<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >雙 |
|
雙 |
|
- >日期時間戳 |
|
時間戳 |
|
數組<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2) |
|
二進製 |
|
布爾 |
|
時間間隔 |
|
地圖<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2) |
|
字符串 |
|
結構體<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2) |
(1)為<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最常見的決議浮動跳過避免精度的損失。
(2)對於一個複雜類型優先級的規則遞歸地適用於它的組成元素。
字符串和空<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#strings-and-null" title="">
特殊規則申請字符串
和無類型零
:
零
可以推廣到任何其他類型。字符串
可以晉升為長整型數字
,二進製
,布爾
,日期
,雙
,時間間隔
,時間戳
。如果實際的字符串值不能投<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最常見的類型磚提出了一個運行時錯誤。當促進時間間隔
間隔單位的字符串值必須匹配。
類型優先圖<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph" title="">
這是一個圖形化描述的優先等級,結合<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表和<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#strings-and-null">字符串和null規則。
最常見的決議<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution" title="">
最常見的類型是可及的最窄的類型<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph">類型優先圖的所有元素的集合類型。
最常見的決議是用來:
判定一個給定類型的函數,預計參數可以調用使用一個窄的一個參數類型。
得到一個函數的參數類型,預計共享多個參數,參數類型等<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/coalesce.html">合並,<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/in.html">在,<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/least.html">至少,或<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/greatest.html">最大的。
推導出操作數類型運營商如算術運算或比較。
推導結果類型等表情<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/case.html">案例表達。
推導出元素、鍵或值類型<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/array.html">數組和<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/map.html">地圖構造函數。
推導的結果類型<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/sql-ref-syntax-qry-select-setops.html">聯盟,相交,或除外集合操作符。
特殊規則應用如果最常見的類型解析浮動
。如果任何類型的貢獻是一個精確的數字類型(非常小的整數
,短整型
,整數
,長整型數字
,或小數
最常見的類型是推到雙
為了避免潛在損失的數字。
隱式向下類型轉換和crosscasting<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#implicit-downcasting-and-crosscasting" title="">
磚使用這些形式的隱式鑄造隻在函數和運算符調用,並且隻可以明確地確定意圖。
隱式向下類型轉換
隱式向下類型轉換自動投下更多類型窄而不需要顯式地指定演員類型。向下類型轉換方便,但它帶來意想不到的運行時錯誤的風險,如果在狹窄的實際值無法表示的類型。
向下類型轉換應用<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表在相反的順序。
隱式crosscasting
隱式crosscasting投下一個值從一種類型的家庭到另一個而不需要顯式地指定演員。
磚支持隱式crosscasting從:
任何簡單類型,除了
二進製
,字符串
。一個
字符串
任何簡單類型。
鑄件在函數調用<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#casting-on-function-invocation" title="">
給定一個解析函數或運算符,下麵的規則適用,他們列出的順序,每一對參數和參數:
如果一個受支持的參數類型是討論的一部分<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph">類型優先圖,磚<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-promotion">促進的參數,參數類型。
在大多數情況下,明確國家支持的類型或鏈函數描述,如“任何數值類型”。
例如,<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/sin.html">sin (expr)作用於
雙
但會接受任何數字。如果預期的參數類型
字符串
參數是一個簡單類型數據磚<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts的參數字符串參數類型。例如,<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/substr.html">substr (str,開始,蘭)預計
str
是一個字符串
。相反,您可以通過一個數字或日期時間類型。如果參數類型是
字符串
和預期的參數類型是一個簡單類型,磚<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts最廣泛支持的參數類型的字符串參數。例如,<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)預計
日期
和一個整數
。如果您調用
date_add ()
有兩個字符串
年代,磚<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts第一個字符串
來日期
第二個字符串
到一個整數
。如果函數預計數值類型,如一個
整數
,或者一個日期
類型,但是參數是一種更普遍的類型,如雙
或時間戳
,磚隱式<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#downcasting">沮喪的的參數,參數類型。例如,一個<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)預計
日期
和一個整數
。如果您調用
date_add ()
與一個時間戳
和一個長整型數字
,磚<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#downcasting">沮喪的的時間戳
來日期
通過移除組件和時間長整型數字
到一個整數
。否則,磚提出了一個錯誤。
例子<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#examples" title="">
的<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/coalesce.html">合並功能接受任何一組參數類型,隻要他們分享<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最常見的類型。
結果類型是最常見的一種參數。
——最常見的一種非常小的整數和BIGINT BIGINT>選擇typeof(合並(1Y,1l,零));長整型數字——整數和日期不共享一個優先級鏈或支持crosscasting方向。>選擇typeof(合並(1,日期“2020-01-01”));錯誤:不兼容的類型(INT,日期]——都是數組和有一個最常見的元素>選擇typeof(合並(數組(1Y),數組(1l)))數組<長整型數字>——最常見的INT類型和浮動是雙重的>選擇typeof(合並(1,1F))雙>選擇typeof(合並(1l,1F))雙>選擇typeof(合並(1雙相障礙,1F))雙——整型和字符串之間最常見的類型是長整型數字>選擇typeof(合並(5,“6”));長整型數字——最常見的類型是一個長整型數字,但不是長整型數字值。>選擇合並(“6.1”,5);錯誤:6。1是不一個長整型數字——最常見小數和字符串之間的兩倍>選擇typeof(合並(1雙相障礙,“6”));雙
的<一個class="reference internal" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/substring.html">substring函數預計參數的類型字符串
字符串和整數
開始和長度參數。
——促進非常小的整數到整數>選擇子字符串(“你好”,1Y,2);他——沒有鑄造>選擇子字符串(“你好”,1,2);他——鑄造一個文字字符串>選擇子字符串(“你好”,' 1 ',2);他——向下類型轉換的BIGINT INT>選擇子字符串(“你好”,1l,2);他——Crosscasting從字符串到整數>選擇子字符串(“你好”,str,2)從值(投(' 1 '作為字符串))作為T(str);他——Crosscasting從整數字符串>選擇子字符串(12345年,2,2);23
| | (CONCAT)允許隱式crosscasting字符串。
——一個數字字符串>選擇這是一個數字:“| |5。4E10汽油;這是一個數字:5。4E10汽油——一個日期字符串>選擇“這是一個日期:”| |日期“2021-11-30”;這是一個日期:2021年- - - - - -11- - - - - -30.
date_add可以調用的時間戳
或長整型數字
由於隱式向下類型轉換。
>選擇date_add(時間戳“2011-11-30 08:30:00”,5l);2011年- - - - - -12- - - - - -05年
date_add可以調用字符串
由於隱性crosscasting年代。
>選擇date_add(“2011-11-30 08:30:00”,“5”);2011年- - - - - -12- - - - - -05年