数据类型

✅ 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 以外的值。
日期/时间 定义一个日期,该日期与以秒(7 位数字、100 纳秒精度)(基于 24 小时制和相对于 UTC(时区偏移量 0)的时间组合在一起。
位 可取值为 1、0 或 NULL 的整数。 兼容级别 1.2 及更高版本支持此功能。
记录 名称/值对集。 值必须支持数据类型。
数组 值的有序集合。 值必须支持数据类型。

可以联接(或比较)bigint 和 float 数据类型。 除无法表示的大写值外,它在所有情况下都能正常工作。

注释

在范围之外读取 bigint 数据类型时,Azure 流分析支持,流分析作业将无法使用错误消息反序列化事件: InputDeserializationError。 可以预处理数据并将其转换为字符串。 一个选项是使用 Azure 函数预处理数据并将此类大整数转换为字符串。

类型转换

以下是控制 数据类型转换的规则:

  • 在输入读取和输出写入作期间没有精度损失的转换是隐式的,并且始终成功
  • 输出写入作内的精度丢失和溢出由配置的错误策略处理(设置为“删除”或“重试”)
  • 错误策略处理输出写入作期间发生的类型转换错误
  • 输入读取作期间发生的类型转换错误导致作业删除事件

将值转换为浮点数时,可能会丢失精度。 它不特定于 Azure 流分析,而是特定于一般浮点数据类型。 因此,它不被视为错误。 在需要保存每个数字的情况下,应将数据读取为字符串。

强制转换数据

流式处理 SQL 语言中有四个函数可用于观察和调整数据的数据类型。

  • CAST :将单个列强制转换为给定类型 - 如果转换错误,作业将失败
  • TRY_CAST :将单个列强制转换为给定类型 - 错误以 NULL 形式提供。 请参阅 输入验证 ,了解如何最好地使用 TRY_CAST
  • CREATE TABLE :定义输入的单个显式架构。 从流中删除了转换错误的行
  • GetType :返回列的类型

对于大多数用例,建议的选项是使用 TRY_CAST。 此函数通过确保输出类型来保护下游处理,同时通过将错误值替换为 NULL 来防止数据丢失。 不会删除该行,并且原始值仍可在另一列中投影。

为了获得强有力的保证,建议的选项是使用 CREATE TABLE。 此方法允许通知作业给定输入的架构,且没有偏差风险。 权衡的是,只能在给定输入上定义单个架构,并且将删除不合规的行。

如果可能,应通过这些函数显式执行所有强制转换作,而不是在其他函数中隐式执行(无提示)。 这可以避免强类型输出(如 SQL 数据库)的类型不匹配、意外行为和插入错误。 请参阅 输入验证 ,了解如何保护主查询逻辑免受此类错误的影响。

转换为位

值将使用以下规则在 float 和 bit 之间转换:

来自 到
(BIT) 1 (FLOAT) 1.0
(BIT) 0 (FLOAT) 0.0
(BIT)零 (FLOAT)零
(FLOAT) 0.0 (BIT) 0
(FLOAT) 任何其他值 (BIT) 1
(FLOAT)零 (BIT)零

类型映射和序列化格式

数据类型 CSV in CSV out JSON in JSON out Avro in Avro out
bigint 转换为 64 位有符号整数的字符串 使用作业区域性转换为字符串的 64 位有符号整数 数字:转换为 64 位有符号整数的整数;

布尔 值:在兼容级别 1.1 及更低版本的“false”中转换为 0,“true”转换为 1
数字:整数 long 和 int 转换为 64 位有符号整数;

布尔值:在 兼容级别 1.1 和更低 false 中转换为 0,true 转换为 1
长整型
漂浮 转换为 64 位有符号浮点数的字符串 使用作业区域性转换为字符串的 64 位有符号浮点数 数字:转换为 64 位有符号浮点数的分数 数字:分数 double 和 float 转换为 64 位有符号浮点数 翻倍
nvarchar(max) 字符串 字符串 字符串 字符串 字符串 字符串
日期/时间 在 ISO 8601 标准之后转换为日期/时间的字符串 使用 ISO 8601 标准的字符串 在 ISO 8601 标准之后转换为日期/时间的字符串 使用 ISO 8601 标准转换为字符串的 datetime 在 ISO 8601 标准之后转换为日期/时间的字符串 使用 ISO 8601 标准转换为字符串的 datetime
bit (兼容性级别 1.2 及更高版本) 字符串“true”、“false”或“null”将相应地转换为整数值 1、0 或 null 转换为字符串“true”或“false” 布尔值:“false”转换为 0,“true”转换为 1 布尔值:布尔值 布尔值:false 转换为 0,true 转换为 1 布尔
记录 无 不支持,输出“Record”字符串 JSON 对象 JSON 对象 Avro 记录类型 Avro 记录类型
数组 无 不支持,输出“Array”字符串 JSON 对象 JSON 对象 Avro 记录类型 Avro 记录类型

注释

Parquet 不需要任何数据类型转换。

写入结构化数据存储时的类型映射

数据类型 SQL Power BI Azure Cosmos DB PostgreSQL Azure 数据资源管理器
bigint bigint、int、smallint、tinyint、all string types(ntext、nvarchar、char、...) 是的 numeric: integer bigint

如果列类型为小型或整数,则会发生错误“错误的二进制数据格式”。
dynamic、int、long
漂浮 float, real, decimal, numeric, all string types ( ntext, nvarchar, char, ...) 是的 数字:分数 双精度,数字。 限制为 1.78E+308

如果列类型为实际,则会发生错误“错误的二进制数据格式”。
动态、真实、双精度
nvarchar(max) 所有字符串类型(ntext、nvarchar、char、uniqueidentifier...) 是的 字符串 字符变化,文本 动态,字符串
日期/时间 datetime、datetime2、datetimeoffset、所有字符串类型(ntext、nvarchar、char、...) 是的 使用 ISO 8601 标准转换为字符串的 datetime UTC 时间戳的 timestamptz,否则为时间戳 动态、字符串、日期时间
bit (兼容性级别 1.2 及更高版本) bigint、int、smallint、tinyint、bit、所有字符串类型(ntext、nvarchar、char、...) 是的 布尔值:1 转换为 true,0 转换为 false 位 dynamic、bool
记录 不支持,输出“Record”字符串 不支持,输出“Record”字符串 JSON 对象 不支持 dynamic, bool, long, datetime, byte array, real, double, string
数组 不支持,输出“Array”字符串 不支持,输出“Array”字符串 JSON 对象 不支持 动态,字符串