SQL數據類型規則<一個class="headerlink" href="//www.eheci.com/docs.gcp/spark/latest/spark-sql/language-manual/#sql-data-type-rules" title="">

適用於:檢查標記是的磚的SQL檢查標記是的磚運行時

磚使用一些規則來解決衝突的數據類型包括:

你也可以顯式地趕在許多類型:

  • 類型轉換函數大多數類型之間的轉換,如果不能返回錯誤。

  • 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

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);錯誤:61一個長整型數字——最常見小數和字符串之間的兩倍>選擇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字符串。

——一個數字字符串>選擇這是一個數字:“| |54E10汽油;一個數字:54E10汽油——一個日期字符串>選擇“這是一個日期:”| |日期“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年