在 Azure 流分析中,每个记录都有一个相关的数据类型。 数据类型描述 (和约束) 该类型的记录可以保存的值集或该类型的表达式可以生成的值集。
请注意,它是类型而不是列的记录。 列的每个记录可以具有不同的类型。 如果这对于大多数应用程序而言是透明的,则它允许直接处理架构偏移方案和其他异常键入模式。
支持的数据类型
下面是支持的数据类型的列表。
FLOAT
- 1.79E+308 到 -2.23E-308、0 和 2.23E-308 到 1.79E+308 的范围内的浮点数。 浮点十进制值通常没有完全相同的二进制表示形式。 可能会遇到精度损失。 这不是特定于 Azure 流分析,而是发生在所有浮点数实现中。
nvarchar(max)
文本值,包含 Unicode 字符。 注意:不支持 max 以外的值。
datetime
定义一个日期,该日期与一天中的某个时间(秒 (7 位、100 纳秒的精度) 相结合,该时间基于 24 小时制,相对于 UTC (时区偏移量 0) 。
一个整数,该值可以为 1、0 或 NULL。 这在
兼容性级别 1.2
及更高版本中受支持。
记录 (record)
名称/值对集。 值必须属于支持的数据类型。
array
值的有序集合。 值必须属于支持的数据类型。
可以在 (联接或比较 bigint 和 float 数据类型) 。 它在所有情况下都可以正常工作,但无法表示的非常大的 bigint 值的情况除外。
读取 Azure 流分析支持的范围之外的 bigint 数据类型时,流分析作业将无法反序列化事件并显示错误消息:
InputDeserializationError
。 可以预处理数据并将其转换为字符串。 一个选项是使用 Azure 函数预处理数据,并将此类大整数转换为字符串。
以下是管理
数据类型转换的规则
:
输入读取和输出写入操作期间没有精度损失的转换是隐式的,并且始终成功
输出写入操作中的精度丢失和溢出由配置的错误策略处理, (设置为 Drop 或 Retry)
输出写入操作期间发生的类型转换错误由错误策略处理
输入读取操作期间发生的类型转换错误导致作业删除事件
将值转换为 float 时可能会丢失精度。 它不是特定于 Azure 流分析,而是通常特定于 float 数据类型。 因此,它不被视为错误。 在需要保存每个数字的情况下,应将数据读取为字符串。
强制转换数据
流式处理 SQL 语言中有四个函数,可用于观察和调整数据的数据类型。
CAST
:将单个列强制转换为给定类型 - 如果出现转换错误,作业将失败
TRY_CAST
:将单个列强制转换为给定类型 - 错误以 NULL 的形式传递。 有关如何最好地使用
,请参阅输入验证
TRY_CAST
CREATE TABLE
:定义输入的单个显式架构。 具有转换错误的行将从流中删除
GetType
:返回列的类型
对于大多数用例,建议使用
TRY_CAST
。 此函数通过确保输出类型来保护下游处理,同时通过将错误值替换为 NULL 来防止数据丢失。 不会删除该行,并且原始值仍可投影到另一列中。
为了获得强有力的保证,建议的选项是使用
CREATE TABLE
。 此方法允许通知给定输入的架构作业,没有偏差风险。 权衡是,在给定的输入上只能定义单个架构,并且将删除不符合的行。
如果可能,应通过这些函数显式执行所有强制转换操作,而不是在其他函数中隐式 (无提示) 。 这可避免强类型输出(如 SQL 数据库)的类型不匹配、意外行为和插入错误。 请参阅
输入验证
,了解如何保护主查询逻辑免受此类错误的影响。
值将使用以下规则在 float 和 bit 之间转换:
转换为 64 位带符号整数的字符串
使用作业区域性转换为字符串的 64 位带符号整数
number:转换为 64 位带符号整数的整数;
布尔值:在
兼容性级别 1.1
和更低级别中,“false”转换为 0,“true”转换为 1
number:integer
long 和 int 转换为 64 位带符号整数;
布尔值:在
兼容性级别 1.1
和更低级别中,false 转换为 0,true 转换为 1
float
转换为 64 位带符号浮点数的字符串
使用作业区域性转换为字符串的 64 位带符号浮点数
number:分数转换为 64 位带符号浮点数
number: fraction
转换为 64 位带符号浮点数的 double 和 float
Double
nvarchar(max)
string
string
string
string
string
string
datetime
遵循 ISO 8601 标准转换为日期时间的字符串
使用 ISO 8601 标准的字符串
遵循 ISO 8601 标准转换为日期时间的字符串
采用 ISO 8601 标准转换为字符串的日期时间
遵循 ISO 8601 标准转换为日期时间的字符串
采用 ISO 8601 标准转换为字符串的日期时间
bit
(
兼容级别 1.2
及更高)
字符串“true”、“false”或“null”相应地转换为整数值 1、0 或 null
转换为字符串“true”或“false”
布尔值:“false”转换为 0,“true”转换为 1
布尔值:布尔值
布尔值:false 转换为 0,true 转换为 1
boolean
record
不支持,输出“Record”字符串
JSON 对象
JSON 对象
Avro 记录类型
Avro 记录类型
array
不支持,输出“Array”字符串
JSON 对象
JSON 对象
Avro 记录类型
Avro 记录类型
datetime、datetime2、datetimeoffset、所有字符串类型 ( ntext、nvarchar、char、...)
采用 ISO 8601 标准转换为字符串的日期时间
timestamp、time。 支持时区选项,但不提供时区
dynamic、string、datetime
bit
(
兼容级别 1.2
及更高)
bigint、int、smallint、tinyint、bit、所有字符串类型 (ntext、nvarchar、char、...)
布尔值:1 转换为 true,0 转换为 false
动态、布尔
record
不支持,输出“Record”字符串
不支持,输出“Record”字符串
JSON 对象
dynamic、bool、long、datetime、字节数组、real、double、string
array
不支持,输出“Array”字符串
不支持,输出“Array”字符串
JSON 对象
动态,字符串