SQL数据类型规则<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#sql-data-type-rules" title="">

适用于:检查标记是的砖的SQL检查标记是的砖运行时

砖使用一些规则来解决冲突的数据类型包括:

你也可以显式地赶在许多类型:

  • 类型转换函数大多数类型之间的转换,如果不能返回错误。

  • try_cast函数就像<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/cast.html">类型转换函数但通过无效值时返回NULL。

  • 其他<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/sql-ref-functions-builtin.html">内装式功能使用规定格式指令类型之间进行转换。

促销类型<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-promotion" title="">

类型促进铸造的过程是一个类型到另一个类型相同类型的家庭它包含所有可能的值的原始类型。因此,促销是一个安全的操作类型。例如非常小的整数有一个从-128年127年。可以安全地提升为其所有可能的值整数

类型优先级列表<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list" title="">

的<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">类型优先级列表定义的值是否一个给定的数据类型可以隐式地提升到另一个数据类型。

数据类型

优先级列表(从窄到宽)

非常小的整数

非常小的整数- > SMALLINT - > INT - > BIGINT - >十进制- >浮动<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

短整型

SMALLINT - > INT - > BIGINT - >十进制- >浮动<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

INT

INT - > BIGINT - >十进制- >浮动<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

长整型数字

长整型数字小数点- > - >浮动<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

小数

小数- >浮点数<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

浮动

浮动<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#1">(1)- >双

日期

- >日期时间戳

时间戳

时间戳

数组

数组<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2)

二进制

二进制

布尔

布尔

时间间隔

时间间隔

地图

地图<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2)

字符串

字符串

结构体

结构体<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#2">(2)

(1)为<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最常见的决议浮动跳过避免精度的损失。

(2)对于一个复杂类型优先级的规则递归地适用于它的组成元素。

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

特殊规则申请字符串和无类型:

  • 可以推广到任何其他类型。

  • 字符串可以晋升为长整型数字,二进制,布尔,日期,,时间间隔,时间戳。如果实际的字符串值不能投<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution">最常见的类型砖提出了一个运行时错误。当促进时间间隔间隔单位的字符串值必须匹配。

类型优先图<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph" title="">

这是一个图形化描述的优先等级,结合<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">类型优先级列表和<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#strings-and-null">字符串和null规则。

优先规则的图形表示形式

最常见的决议<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#least-common-type-resolution" title="">

最常见的类型是可及的最窄的类型<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph">类型优先图的所有元素的集合类型。

最常见的决议是用来:

  • 判定一个给定类型的函数,预计参数可以调用使用一个窄的一个参数类型。

  • 得到一个函数的参数类型,预计共享多个参数,参数类型等<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/coalesce.html">合并,<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/in.html">,<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/least.html">至少,或<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/greatest.html">最大的

  • 推导出操作数类型运营商如算术运算或比较。

  • 推导结果类型等表情<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/case.html">案例表达

  • 推导出元素、键或值类型<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/array.html">数组和<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/map.html">地图构造函数。

  • 推导的结果类型<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/sql-ref-syntax-qry-select-setops.html">联盟,相交,或除外集合操作符。

特殊规则应用如果最常见的类型解析浮动。如果任何类型的贡献是一个精确的数字类型(非常小的整数,短整型,整数,长整型数字,或小数最常见的类型是推到为了避免潜在损失的数字。

隐式向下类型转换和crosscasting<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#implicit-downcasting-and-crosscasting" title="">

砖使用这些形式的隐式铸造只在函数和运算符调用,并且只可以明确地确定意图。

  • 隐式向下类型转换

    隐式向下类型转换自动投下更多类型窄而不需要显式地指定演员类型。向下类型转换方便,但它带来意想不到的运行时错误的风险,如果在狭窄的实际值无法表示的类型。

    向下类型转换应用<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-list">类型优先级列表在相反的顺序。

  • 隐式crosscasting

    隐式crosscasting投下一个值从一种类型的家庭到另一个而不需要显式地指定演员。

    砖支持隐式crosscasting从:

    • 任何简单类型,除了二进制,字符串

    • 一个字符串任何简单类型。

铸件在函数调用<一个class="headerlink" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#casting-on-function-invocation" title="">

给定一个解析函数或运算符,下面的规则适用,他们列出的顺序,每一对参数和参数:

  • 如果一个受支持的参数类型是讨论的一部分<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-precedence-graph">类型优先图,砖<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#type-promotion">促进的参数,参数类型。

    在大多数情况下,明确国家支持的类型或链函数描述,如“任何数值类型”。

    例如,<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/sin.html">sin (expr)作用于但会接受任何数字。

  • 如果预期的参数类型字符串参数是一个简单类型数据砖<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts的参数字符串参数类型。

    例如,<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/substr.html">substr (str,开始,兰)预计str是一个字符串。相反,您可以通过一个数字或日期时间类型。

  • 如果参数类型是字符串和预期的参数类型是一个简单类型,砖<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts最广泛支持的参数类型的字符串参数。

    例如,<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)预计日期和一个整数

    如果您调用date_add ()有两个字符串年代,砖<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#crosscasting">crosscasts第一个字符串日期第二个字符串到一个整数

  • 如果函数预计数值类型,如一个整数,或者一个日期类型,但是参数是一种更普遍的类型,如时间戳,砖隐式<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#downcasting">沮丧的的参数,参数类型。

    例如,一个<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/date_add.html">date_add(日期、天)预计日期和一个整数

    如果您调用date_add ()与一个时间戳和一个长整型数字,砖<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/#downcasting">沮丧的时间戳日期通过移除组件和时间长整型数字到一个整数

  • 否则,砖提出了一个错误。

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

的<一个class="reference internal" href="//www.neidfyre.com/docs.gcp/spark/latest/spark-sql/language-manual/functions/coalesce.html">合并功能接受任何一组参数类型,只要他们分享<一个class="reference internal" href="//www.neidfyre.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.neidfyre.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年