函数

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

强制类型转换的值expr到目标数据类型类型。这个操作符是一个同义词::(结肠直肠癌)算子

语法

(sourceExpr作为targetType)

参数

  • sourceExpr:任何可塑的表达式。

  • targetType:结果的数据类型。

返回

结果类型targetType

以下数据类型铸造的组合是有效的:

源(行)目标(列)

无效

数字

字符串

日期

时间戳

TIMESTAMP_NTZ

year-month间隔

白天的时间间隔

布尔

二进制

数组

地图

结构体

无效

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

数字

N

Y

Y

N

Y

N

Y

Y

Y

N

N

N

N

字符串

N

Y

Y

Y

Y

Y

Y

Y

Y

Y

N

N

N

日期

N

N

Y

Y

Y

Y

N

N

N

N

N

N

N

时间戳

N

Y

Y

Y

Y

Y

N

N

N

N

N

N

N

TIMESTAMP_NTZ

N

N

Y

Y

Y

Y

N

N

N

N

N

N

N

year-month间隔

N

Y

Y

N

N

N

Y

N

N

N

N

N

N

白天的时间间隔

N

Y

Y

N

N

N

N

Y

N

N

N

N

N

布尔

N

Y

Y

N

Y

N

N

N

Y

N

N

N

N

二进制

N

Y

Y

N

N

N

N

N

N

Y

N

N

N

数组

N

N

Y

N

N

N

N

N

N

N

Y

N

N

地图

N

N

Y

N

N

N

N

N

N

N

N

Y

N

结构体

N

N

Y

N

N

N

N

N

N

N

N

N

Y

基于targetType规则和限制

警告

在砖运行时,如果spark.sql.ansi.enabled,一个溢出不会导致一个错误,而是将“包装”的结果。

一个sourceExpr值和一个无效的格式或无效字符targetType将导致

数字

如果targetType是一个数字sourceExpr的类型是:

  • 无效

    结果是一个空的指定的数值类型。

  • 数字

    如果targetType是一个积分数值,结果是sourceExpr截断一个整数。

    否则,结果是sourceExpr圆形的适合的可用的规模targetType

    如果该值超出范围targetType,一个溢出错误。

    使用try_cast将溢出错误

  • 字符串

    sourceExpr读取一个文本值的吗targetType

    如果sourceExpr不符合格式的文字值,一个错误。

    如果该值为范围以外的targetType,一个溢出错误。

    使用try_cast将溢出和无效的格式错误

  • 时间戳

    结果是运行之间的秒数1970-01-01就是UTCsourceExpr

    如果targetType是一个积分数值,结果是<年代trong>截断一个整数。

    否则,结果是<年代trong>圆形的适合的可用的规模targetType

    如果结果超出范围targetType,一个溢出错误。

    使用try_cast将溢出错误

  • 时间间隔

    适用于:检查标记是的砖的SQL检查标记是的砖运行时11.2及以上

    必须是一个目标类型确切的数字

    给定一个时间间隔upper_unitlower_unit测量结果的总数lower_unit。如果lower_unit第二个分数秒存储小数点右边的。对于所有其他间隔结果始终是一个整数。

  • 布尔

    如果sourceExpr是:

    • 真正的:结果是0。

    • :结果是1。

    • :结果是

例子

>选择(作为INT);>选择(56作为INT);5>选择(56作为小数(2,0));6>选择(- - - - - -56作为INT);- - - - - -5>选择(- - - - - -56作为小数(2,0));- - - - - -6>选择(128年作为非常小的整数);溢出>选择(128年作为小数(2,0));溢出>选择(“123”作为INT);123年>选择(“123.0”作为INT);无效的格式>选择(时间戳“1970-01-01 00:00:01”作为);1>选择(时间戳“1970-01-01 00:00:00.000001”作为);10E- - - - - -6>选择(时间戳“2022-02-01”就是作为短整型);错误:溢出>选择(真正的作为布尔);1>选择(时间间隔“1 - 2”一年作为整数);14>选择(时间间隔“1:30.5”一分钟第二个作为小数(5,2));90年50>选择(真正的作为INT);1>选择(作为INT);0

字符串

如果targetType是一个字符串类型sourceExpr的类型是:

  • 无效

    结果是一个空字符串。

  • 确切的数字

    结果是一个可选的文字数量负号,没有前导零,除了单一数字小数点左边的。如果targetType小数(p,s)年代更大的0,添加一个小数点和尾随零加起来。

  • 浮点数的二进制

    如果绝对数量少10000000年大于或等于0.001,结果是没有科学记数法表示至少有一位小数点的两侧。

    否则,砖使用一个尾数紧随其后E和一个指数。尾数有一个可选的前置负号紧随其后的是一位小数点左边的,和数字的最小值大于零。指数和可选的前置负号。

  • 日期

    如果是在公元前9999年和公元9999年之间,是一个结果dateString的形式-YYYY-MM-DDYYYY-MM-DD分别。

    多年之前或之后这个范围,必要数量的数字被添加到组件和+用于CE。

  • 时间戳

    如果是在公元前9999年和公元9999年之间,是一个结果timestampString的形式-YYYY-MM-DDhh: mm: ssYYYY-MM-DDhh: mm: ss分别。

    多年之前或之后这个范围,必要数量的数字被添加到组件和+用于CE。

    分数秒.f……必要时添加。

  • TIMESTAMP_NTZ

    如果是在公元前9999年和公元9999年之间,是一个结果timestampString的形式-YYYY-MM-DDhh: mm: ssYYYY-MM-DDhh: mm: ss分别。

    多年之前或之后这个范围,必要数量的数字被添加到组件和+用于CE。

    分数秒.f……必要时添加。

  • year-month间隔

    结果是它的最短的表示间隔文字。如果时间间隔是负的,是嵌入在迹象interval-string。对于单位小于10,前导零省略。

    一个典型的year-month间隔字符串的形式:

    • 时间间隔“Y”一年

    • 时间间隔“y m”一年

    • 时间间隔“米”

  • 白天的时间间隔

    结果是它的最短的表示间隔文字。如果时间间隔是负的,是嵌入在迹象interval-string。对于单位小于10,前导零省略。

    一个典型的一天时间间隔字符串的形式:

    • 时间间隔' D '一天

    • 时间间隔' Dh”一天小时

    • 时间间隔' Dh: m”一天一分钟

    • 时间间隔' Dh: m:年代一天第二个

    • 时间间隔“h”小时

    • 时间间隔“h: m”小时一分钟

    • 时间间隔m:年代”一分钟第二个

    • 时间间隔“年代”第二个

  • 布尔

    的结果真正的布尔是字符串真正的,因为字符串文字,对于这是空字符串。

  • 二进制

    结果是二进制sourceExpr解读为utf - 8字符序列。

    砖不验证utf - 8字符。一个演员二进制字符串永远不会注入替换字符或提高一个错误。

  • 数组

    结果是一个逗号分隔的列表元素,这是做好方括号(]。一个空间遵循逗号。一个元素是翻译文字

    砖不引用或马克单个元素,这可能包含括号或逗号。

  • 地图

    结果是一个逗号分隔的列表键值对,这是由花括号{}。一个空间遵循逗号。每个键值对由一个分隔- >。一个映射值转换成文字

    砖不引用或马克个人键或值,可能本身可能包含花括号,逗号或- >

  • 结构体

    结果是一个逗号分隔的列表字段值,这是由花括号{}。一个空间遵循逗号。一个字段值是字面翻译

    砖不引用的每个字段值或标志,可能本身可能包含花括号,或者逗号。

例子

>选择铸造(空字符串);空>选择铸造(3 y作为字符串);3 >选择演员(5::小数(10、5)字符串);5.00000 >选择演员(12345678军医为字符串);1234.5678 >选择铸造(1 e7字符串);1.0 e7 >选择铸造(1 e6字符串);1000000.0 >选择铸造(1军医字符串);1.0 >选择演员的军医(1 e - 3字符串);0.001 >选择演员(12345678 e7是字符串);1.2345678 e14灯头>选择演员(日期“1900-12-31”作为字符串); 1900-12-31 -- Caesar no more > SELECT cast(DATE'-0044-03-15' AS STRING); -0044-03-15 > SELECT cast(DATE'100000-12-31' AS STRING); +100000-12-31 > SELECT cast(current_timestamp() AS STRING); 2022-04-02 22:29:09.783 > SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING); 2023-01-01 00:00:00 > SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING); INTERVAL '-13-2' YEAR TO MONTH > SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING); INTERVAL '12:04.99' MINUTE TO SECOND > SELECT cast(true AS STRING); true > SELECT cast(false AS STRING); false -- A bad UTF-8 string > SELECT cast(x'33800033' AS STRING); 3�3 > SELECT hex(cast(x'33800033' AS STRING)); 33800033 > SELECT cast(array('hello', NULL, 'world') AS STRING); [hello, null, world] > SELECT cast(array('hello', 'wor, ld') AS STRING); [hello, wor, ld] > SELECT cast(array() AS STRING); [] > SELECT cast(map('hello', 1, 'world', null) AS STRING); {hello -> 1, world -> null} > SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING); {hello -> 1 -> 2022-01-01} > SELECT cast(map() AS STRING); {} > SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING); {5, 6, null} > SELECT cast(named_struct() AS STRING); {}

日期

如果targetType是一个日期类型sourceExpr的类型是:

  • 无效

    结果是一个零。

  • 字符串

    sourceExpr必须是一个有效的dateString

    如果sourceExpr不是一个有效的dateString,砖返回一个错误。

    使用try_cast把无效的数据错误

  • 时间戳

    结果是日期时间戳的一部分sourceExpr

  • TIMESTAMP_NTZ

    结果是timestamp_ntz的日期部分sourceExpr

例子

>选择(作为日期);>选择(“1900-10-01”作为日期);1900年- - - - - -10- - - - - -01>选择(“1900-10-01”作为日期);1900年- - - - - -10- - - - - -01——没有2月30。>选择(“1900-02-30”作为日期);错误>选择(时间戳“1900-10-01 12:13:14”作为日期);1900年- - - - - -10- - - - - -01>选择(TIMESTAMP_NTZ“1900-10-01 12:13:14”作为日期);1900年- - - - - -10- - - - - -01

时间戳

如果targetType是一个时间戳类型sourceExpr的类型是:

  • 无效

    结果是一个零。

  • 数字

    sourceExpr读取以来的秒数吗1970-01-01就是UTC

    分数小于微秒截断。

    如果该值的范围之外的时间戳,一个溢出错误。

    使用try_cast将溢出错误

  • 字符串

    sourceExpr必须是一个有效的timestampString

    如果sourceExpr不是一个有效的timestampString,砖返回一个错误。

    使用try_cast把无效的数据错误

  • 日期

    结果是sourceExpr日期在就是小时。

  • TIMESTAMP_NTZ

结果是一个时间戳值相同的年/月/日/小时/分钟/ timestamp_ntz的第二个字段sourceExpr

例子

>选择(作为时间戳);>时间“+ 00:00”;>选择(00作为时间戳);1970年- - - - - -01- - - - - -0100:00:00>选择(00000009作为时间戳);1970年- - - - - -01- - - - - -0100:00:00>选择(1e20作为时间戳);错误:溢出>选择(“1900”作为时间戳);1900年- - - - - -01- - - - - -0100:00:00>选择(“1900-10-01 12:13:14”作为时间戳);1900年- - - - - -10- - - - - -0112:13:14>选择(“1900-02-30 12:13:14”作为时间戳);错误>选择(日期“1900-10-01”作为时间戳);1900年- - - - - -10- - - - - -0100:00:00>选择(TIMESTAMP_NTZ“2023-01-01 02:03:04.567”作为时间戳)2023年- - - - - -01- - - - - -0102:03:04567年

TIMESTAMP_NTZ

如果targetType是一个TIMESTAMP_NTZ类型sourceExpr的类型是:

  • 无效

    结果是一个零。

  • 字符串

    sourceExpr必须是一个有效的timestampString

    如果sourceExpr不是一个有效的timestampString,砖返回一个错误。

    使用try_cast把无效的数据错误

  • 日期

    结果是sourceExpr日期在就是小时。

  • 时间戳

结果是当地时间的sourceExpr在会话时区。

例子

>选择(作为TIMESTAMP_NTZ);>选择(“1900”作为TIMESTAMP_NTZ);1900年- - - - - -01- - - - - -0100:00:00>选择(“1900-10-01 12:13:14”作为TIMESTAMP_NTZ);1900年- - - - - -10- - - - - -0112:13:14>选择(“1900-02-30 12:13:14”作为TIMESTAMP_NTZ);错误>选择(日期“1900-10-01”作为TIMESTAMP_NTZ);1900年- - - - - -10- - - - - -0100:00:00>选择current_timezone(),(时间戳2021 - 7 - 1 - t8:43:28作为TIMESTAMP_NTZ);美国/Los_Angeles2021年- - - - - -07年- - - - - -0108年:43:28>选择current_timezone(),(时间戳2021 - 7 - 1 - t8:43:28utc + 3 '作为TIMESTAMP_NTZ);美国/Los_Angeles2021年- - - - - -06- - - - - -30.22:43:28

year-month间隔

如果targetType是一个year-month间隔sourceExpr的类型是:

例子

>选择(作为时间间隔一年);>选择(“1 - 4”作为时间间隔一年)::字符串;时间间隔“1 - 4”一年>选择(' 1 '作为时间间隔一年);错误>选择(时间间隔“1 - 4”一年作为时间间隔)::字符串;时间间隔“16”>选择(14作为时间间隔一年)::字符串;时间间隔“1 - 2”一年>选择(时间间隔1 - 11的一年作为时间间隔一年)::字符串;时间间隔' 1 '一年

白天的时间间隔

如果targetType是一个白天的时间间隔sourceExpr的类型是:

>选择(作为时间间隔小时);>选择(“1 23”作为时间间隔一天一分钟)::字符串;时间间隔“1 04:23”一天一分钟>选择(' 1 '作为时间间隔一天一分钟);错误>选择(时间间隔“1 23”一天一分钟作为时间间隔一分钟)::字符串;时间间隔“1703”一分钟>选择(时间间隔“1 23”一天一分钟作为时间间隔小时)::字符串;时间间隔“28”小时>选择(125年3作为时间间隔一分钟第二个)::字符串;时间间隔“2:5.3”一分钟第二个

布尔

如果targetType是一个布尔sourceExpr的类型是:

  • 无效

    结果是一个零布尔。

  • 数字

    如果sourceExpr是:

    • 0:结果是

      否则,结果是真正的

  • 字符串

    如果sourcEexpr(不区分大小写):

    • “T”,“真正的”,“Y”,“是的”,' 1 ':结果是真正的

    • “F”,“假”,“N”,“不”,' 0 ':结果是

    • :结果是

    否则,砖返回一个无效的输入类型逻辑错误的语法。

    使用try_cast把无效的数据错误

例子

>选择(作为布尔);>选择(“T”作为布尔);真正的>选择(“真正的”作为布尔);真正的>选择(' 1 '作为布尔);真正的>选择(' 0 '作为布尔);>选择(“n”作为布尔);>选择(“上”作为布尔);错误:无效的输入语法类型布尔>选择(0作为布尔);>选择(00E10汽油作为布尔);>选择(1作为布尔);真正的>选择(01作为布尔);真正的>选择(“南”::浮动作为布尔);真正的

二进制

如果targetType是一个二进制sourceExpr的类型是:

  • 无效

    结果是一个零二进制。

  • 字符串

    结果是utf - 8编码的surceExpr

例子

>选择(作为二进制);>选择十六进制((“火花SQL”作为二进制));537061726B2053514C>选择十六进制((“Oдesa”作为二进制));4FD0B4657361

数组

如果targetType是一个数组< targetElementType >sourceExpr的类型是:

  • 无效

    结果是空的targeType

  • 数组< sourceElementType >

    如果演员sourceElementTypetargetElementType支持,结果是一个数组< targetElementType >与所有元素的targetElementType

    砖提出一个错误如果演员不支持或如果任何元素不能投。

    使用try_cast把无效的数据或溢出错误

例子

>选择(作为数组<INT>);>选择(数组(“t”,“f”,)作为数组<布尔>);(真正的,,]>选择(数组(“t”,“f”,)作为时间间隔一年);错误:不能数组<字符串>时间间隔一年>选择(数组(“t”,“f”,“o”)作为数组<布尔>);错误:无效的输入语法类型布尔:o

地图

如果targetType是一个MAP < targetKeyType, targetValueType >sourceExpr的类型是:

  • 无效

    结果是空的targetType

  • MAP < sourceKeyType, sourceValueType >

    如果投的sourceKeyTypetargetKeyTypesourceValueTypetargetValueType支持,结果是一个MAP < targetKeyType,targetValueType >与所有钥匙的targetKeyType和所有的值targetValueType

    砖提出一个错误如果演员不支持或者任何键或值不能投。

    使用try_cast把无效的数据或溢出错误

例子

>选择演员(NULL作为MAP < STRING, INT >);零>选择演员(地图(“10”、“t”,“15”,“f”,“20”, NULL)作为map < INT,布尔>);{10:真的,15:假的,20:零}>选择演员(map (“10”、“t”,“15”,“f”,“20”, null)作为map < INT数组< INT > >);错误:不能把map < string, string > < int数组< int > > >地图选择演员(map (“10”、“t”,“15”,“f”、“20”,“o”)作为map < int,布尔>);错误:无效输入语法类型布尔:o。

结构体

如果targetType是一个STRUCT < [targetFieldName: targetFieldType [NOT NULL][评论str] […]] >sourceExpr的类型是:

  • 无效

    结果是空的targetType

  • STRUCT < [sourceFieldName: sourceFieldType [NOT NULL][评论str] […]] >

    sourceExpr可以投targetType如果你所有的条件是正确的:

    • 源类型具有相同数量的字段作为目标

    • 对于所有字段:sourceFieldTypeN可以投到吗targetFieldTypeN

    • 对于所有字段值:源字段值N可以投targetFieldTypeN值不是null如果目标字段N是标记为

    sourceFieldName年代,源约束和来源评论不需要匹配targetType和被忽略。

    砖提出一个错误如果演员不支持或者任何键或值不能投。

    使用try_cast把无效的数据或溢出错误

例子

>选择演员(NULL作为STRUCT <答:INT >);空>选择演员(named_struct (' a ', ' t ', ' b ', ' 1900 ')作为STRUCT < b:布尔,c:日期NOT NULL评论'你好' >);{“b”:真的,“c”: 1900-01-01} >选择演员(named_struct (' a ', ' t ', ' b ',零::日期)作为STRUCT < b:布尔,c:日期NOT NULL评论'你好' >);错误:不能把结构体<字符串,b:日期> struct < b:布尔,c:日期> >选择演员(named_struct (' a ', ' t ', ' b ', ' 1900 ')作为struct < b:布尔,c:数组< INT > >);错误:不能把结构体<字符串,b:字符串> struct < b:布尔,c:数组< int > > >选择演员(named_struct (' a ', ' t ', ' b ', '你好')作为struct < b:布尔,c:日期>);错误:不能投喂DateType