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

適用於:勾選“是”磚的SQL勾選“是”磚運行時

Databricks使用幾個規則來解決數據類型之間的衝突:

你也可以在許多類型之間顯式強製轉換:

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

  • try_cast函數就像<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/cast.html">類型轉換函數但當傳遞無效值時返回NULL。

  • 其他<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/sql-ref-functions-builtin.html">內裝式功能使用提供的格式指令在類型之間進行強製轉換。

促銷類型<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-promotion" title="">

類型提升是將一種類型轉換為同一類型族中的另一種類型的過程,該類型族包含原始類型的所有可能值。因此類型提升是一種安全操作。例如非常小的整數範圍從-128年127.它所有可能的值都可以安全地提升到整數

類型優先級列表<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-list" title="">

的<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表定義是否可以將給定數據類型的值隱式提升為另一種數據類型。

數據類型

優先級列表(從最窄到最寬)

非常小的整數

Tinyint -> smallint -> int -> bigint -> decimal -> float<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

短整型

Smallint -> int -> bigint -> decimal -> float<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

INT

Int -> bigint -> decimal -> float<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

長整型數字

Bigint -> decimal -> float<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

小數

Decimal ->浮點數<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

浮動

浮動<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#1">(1)- >雙

日期

Date ->時間戳

時間戳

時間戳

數組

數組<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#2">(2)

二進製

二進製

布爾

布爾

時間間隔

時間間隔

地圖

地圖<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#2">(2)

字符串

字符串

結構體

結構體<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#2">(2)

(1)為<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最小共型分辨率跳過FLOAT以避免精度損失。

(2)對於複雜類型,優先級規則遞歸應用於其組件元素。

字符串和NULL<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#strings-and-null" title="">

適用特殊規則字符串和無類型

  • 可以提升到任何其他類型。

  • 字符串可以晉升到長整型數字二進製布爾日期時間間隔,時間戳.如果實際字符串值不能強製轉換為<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最小常見類型Databricks引發運行時錯誤。當晉升到時間間隔字符串值必須與間隔單位匹配。

類型優先圖<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-graph" title="">

的優先級層次結構的圖形化描述<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表而且<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#strings-and-null">字符串和null規則。

優先級規則的圖形表示

最小共型分辨率<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#least-common-type-resolution" title="">

類型集中最不常用的類型是類可到達的最窄的類型<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-graph">類型優先圖類型集合的所有元素。

最小常見類型分辨率用於:

  • 決定是否可以使用較窄類型的實參調用期望給定類型形參的函數。

  • 派生為多個形參期望共享形參類型的函數的實參類型,例如<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/coalesce.html">合並,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/in.html">,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/least.html">至少,或<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/greatest.html">最大的

  • 派生運算符(如算術運算或比較)的操作數類型。

  • 的表達式派生結果類型<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/case.html">案例表達

  • 派生的元素、鍵或值類型<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/array.html">數組而且<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/map.html">地圖構造函數。

  • 派生的結果類型<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/sql-ref-syntax-qry-select-setops.html">聯合、機密或例外集合操作符。

如果最小公共類型解析為,則應用特殊規則浮動.如果任何貢獻類型是精確的數字類型(非常小的整數短整型整數長整型數字,或小數)最不常見的類型被推到避免潛在的數字丟失。

隱式向下強製轉換和交叉強製轉換<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#implicit-downcasting-and-crosscasting" title="">

Databricks僅在函數和操作符調用上使用這些形式的隱式強製轉換,並且僅在可以明確確定意圖的情況下使用。

  • 隱式向下類型轉換

    隱式向下強製轉換自動將較寬的類型強製轉換為較窄的類型,而不需要顯式指定強製轉換。向下強製轉換很方便,但如果實際值無法在窄類型中表示,則會帶來意外運行時錯誤的風險。

    向下類型轉換應用<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-list">類型優先級列表相反的順序。

  • 隱式crosscasting

    隱式交叉轉換將一個值從一個類型族轉換為另一個類型族,而不需要顯式地指定該類型。

    Databricks支持隱式交叉轉換:

    • 任何簡單類型,除了二進製,字符串

    • 一個字符串到任何簡單的類型。

函數調用上的強製轉換<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#casting-on-function-invocation" title="">

給定一個已解析的函數或運算符,對於每個形參和實參對,按照它們列出的順序,應用以下規則:

  • 如果受支持的形參類型是實參的一部分<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-precedence-graph">類型優先圖,磚<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#type-promotion">促進該形參類型的參數。

    在大多數情況下,函數描述顯式地聲明了支持的類型或鏈,例如“任何數字類型”。

    例如,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/sin.html">sin (expr)作用於但將接受任何數字。

  • 如果期望的參數類型是a字符串參數是一個簡單類型Databricks<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts字符串形參類型的實參。

    例如,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/substr.html">Substr (str, start, len)預計str成為一名字符串.相反,您可以傳遞數字或datetime類型。

  • 如果參數類型是a字符串期望的參數類型是簡單類型Databricks<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts最廣泛支持的形參類型的字符串實參。

    例如,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)預計日期和一個整數

    如果你調用date_add ()有兩個字符串年代,磚<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts第一個字符串日期第二個字符串到一個整數

  • 如果函數需要一個數字類型,例如整數,或日期類型,但實參是更通用的類型,例如時間戳, Databricks隱式<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#downcasting">沮喪的該形參類型的參數。

    例如,<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)預計日期和一個整數

    如果你調用date_add ()與一個時間戳和一個長整型數字,磚<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#downcasting">沮喪的時間戳日期通過去掉時間分量和長整型數字到一個整數

  • 否則,Databricks將引發錯誤。

例子<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#examples" title="">

的<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/coalesce.html">合並功能接受任何參數類型集,隻要它們共享<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最小常見類型

結果類型是參數中最不常用的類型。

TINYINT和BIGINT最不常見的類型是BIGINT>選擇typeof合並1Y1l));長整型數字——INTEGER和DATE不共享優先級鏈,也不支持任意方向的交叉轉換。>選擇typeof合並1日期“2020-01-01”));錯誤不兼容的類型INT日期——兩者都是數組,元素有一個最小公共類型>選擇typeof合並數組1Y),數組1l)))數組<長整型數字>INT和FLOAT最不常見的類型是DOUBLE>選擇typeof合並11F))>選擇typeof合並1l1F))>選擇typeof合並1雙相障礙1F))INT和STRING之間最不常見的類型是BIGINT>選擇typeof合並5“6”));長整型數字—最不常見的類型是BIGINT,但值不是BIGINT。>選擇合並“6.1”5);錯誤61一個長整型數字DECIMAL和STRING之間最不常見的類型是DOUBLE>選擇typeof合並1雙相障礙“6”));

的<一個class="reference internal" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/functions/substring.html">substring函數期望類型的參數字符串對於字符串和整數用於起始和長度參數。

TINYINT升級為INTEGER>選擇子字符串“你好”1Y2);——沒有選角>選擇子字符串“你好”12);—字麵值字符串的轉換>選擇子字符串“你好”' 1 '2);——將BIGINT向下轉換為INT>選擇子字符串“你好”1l2);——從STRING轉換為INTEGER>選擇子字符串“你好”str2)' 1 '作為字符串))作為Tstr);——從INTEGER到STRING的交叉轉換>選擇子字符串1234522);23

| | (CONCAT)允許隱式交叉轉換到字符串。

——數值被轉換為STRING>選擇這是一個數字:||54E10汽油;一個數字54E10汽油——日期轉換為STRING>選擇“這是一個日期:”||日期“2021-11-30”;一個日期2021-11-30.

date_add可以使用時間戳長整型數字由於隱式向下轉換。

>選擇date_add時間戳“2011-11-30 08:30:00”5l);2011-12-05

date_add可以使用字符串S由於隱式交叉轉換。

>選擇date_add“2011-11-30 08:30:00”“5”);2011-12-05