数据类型(Azure 流分析)
在 Azure 流分析中,每个记录都有一个相关的数据类型。 数据类型描述 (和约束) 该类型的记录可以保存的值集或该类型的表达式可以生成的值集。
请注意,它是类型而不是列的记录。 列的每个记录可以具有不同的类型。 如果这对于大多数应用程序而言是透明的,则它允许直接处理架构偏移方案和其他异常键入模式。
支持的数据类型
下面是支持的数据类型的列表。
数据类型 | 描述 |
---|---|
bigint | -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的范围内的整数。 |
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) 。 |
bit | 一个整数,该值可以为 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 之间转换:
源 | 功能 |
---|---|
(位) 1 | (FLOAT) 1.0 |
(位) 0 | (FLOAT) 0.0 |
(BIT) NULL | (FLOAT) NULL |
(FLOAT) 0.0 | (位) 0 |
(FLOAT) 任何其他值 | (位) 1 |
(FLOAT) NULL | (BIT) NULL |
类型映射和序列化格式
数据类型 | 中的 CSV | CSV 输出 | 中的 JSON | JSON 输出 | Avro in | Avro out |
---|---|---|---|---|---|---|
bigint | 转换为 64 位带符号整数的字符串 | 使用作业区域性转换为字符串的 64 位带符号整数 | number:转换为 64 位带符号整数的整数; 布尔值:在 兼容性级别 1.1 和更低级别中,“false”转换为 0,“true”转换为 1 |
number:integer | long 和 int 转换为 64 位带符号整数; 布尔值:在 兼容性级别 1.1 和更低级别中,false 转换为 0,true 转换为 1 |
long |
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 记录类型 |
注意
Parquet 不需要数据类型转换。
写入结构化数据存储时的类型映射
数据类型 | SQL | Power BI | Azure Cosmos DB | PostgreSQL | Azure 数据资源管理器 |
---|---|---|---|---|---|
bigint | bigint、int、smallint、tinyint、所有字符串类型 (ntext、nvarchar、char、...) | 是 | numeric:integer | bigint | dynamic、int、long |
float | float、real、decimal、numeric、所有字符串类型 ( ntext、nvarchar、char、...) | 是 | number: fraction | 双精度,数字。 限制为 1.78E+308 | 动态、真实、双精度 |
nvarchar(max) | 所有字符串类型 (ntext、nvarchar、char、uniqueidentifier...) | 是 | 字符串 | 字符变化,文本 | 动态,字符串 |
datetime | 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 | bit | 动态、布尔 |
record | 不支持,输出“Record”字符串 | 不支持,输出“Record”字符串 | JSON 对象 | 不支持 | dynamic、bool、long、datetime、字节数组、real、double、string |
array | 不支持,输出“Array”字符串 | 不支持,输出“Array”字符串 | JSON 对象 | 不支持 | 动态,字符串 |