SQL數據類型規則<一個class="headerlink" href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/#sql-data-type-rules" title="">
適用於:磚的SQL磚運行時
Databricks使用幾個規則來解決數據類型之間的衝突:
促銷活動安全地將一個類型擴展為更寬的類型。
隱式向下類型轉換縮小類型。與提升相反。
隱式crosscasting將一個類型轉換為另一個類型族的類型。
你也可以在許多類型之間顯式強製轉換:
類型轉換函數在大多數類型之間強製轉換,如果不能,則返回錯誤。
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 -> 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(合並(1Y,1l,零));長整型數字——INTEGER和DATE不共享優先級鏈,也不支持任意方向的交叉轉換。>選擇typeof(合並(1,日期“2020-01-01”));錯誤:不兼容的類型[INT,日期]——兩者都是數組,元素有一個最小公共類型>選擇typeof(合並(數組(1Y),數組(1l)))數組<長整型數字>INT和FLOAT最不常見的類型是DOUBLE>選擇typeof(合並(1,1F))雙>選擇typeof(合並(1l,1F))雙>選擇typeof(合並(1雙相障礙,1F))雙INT和STRING之間最不常見的類型是BIGINT>選擇typeof(合並(5,“6”));長整型數字—最不常見的類型是BIGINT,但值不是BIGINT。>選擇合並(“6.1”,5);錯誤:6.1是不一個長整型數字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>選擇子字符串(“你好”,1Y,2);他——沒有選角>選擇子字符串(“你好”,1,2);他—字麵值字符串的轉換>選擇子字符串(“你好”,' 1 ',2);他——將BIGINT向下轉換為INT>選擇子字符串(“你好”,1l,2);他——從STRING轉換為INTEGER>選擇子字符串(“你好”,str,2)從值(投(' 1 '作為字符串))作為T(str);他——從INTEGER到STRING的交叉轉換>選擇子字符串(12345,2,2);23
| | (CONCAT)允許隱式交叉轉換到字符串。
——數值被轉換為STRING>選擇這是一個數字:||5.4E10汽油;這是一個數字:5.4E10汽油——日期轉換為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