Azure 流分析自定义 blob 输出分区

Azure 流分析支持包含自定义字段或属性和自定义 DateTime 路径模式的自定义 blob 输出分区。

自定义字段或属性

自定义字段或输入属性通过允许进一步控制输出,改进下游数据处理和报告工作流。

分区键选项

用于对输入数据进行分区的分区键或列名可以包含 blob 名称可以接受的任何字符。 除非与别名一起使用,否则无法将嵌套字段用作分区键。 不过,可以使用某些字符来创建文件的层次结构。 例如,可以使用以下查询创建一个列,该列将来自其他两个列的数据组合在一起以构成唯一的分区键:

SELECT name, id, CONCAT(name, "/", id) AS nameid

分区键必须为 NVARCHAR(MAX)BIGINTFLOATBIT(1.2 兼容性级别或更高级别)。 不支持 DateTimeArrayRecords 类型,但如果将它们转换为 String,则可用作分区键。 有关详细信息,请参阅 Azure 流分析数据类型

示例

假设作业从连接到外部视频游戏服务的实时用户会话获取输入数据,其中引入的数据包含用于识别会话的列 client_id。 若要按 client_id 对数据进行分区,请在创建作业时将 blob“路径模式”字段设置为在 blob 输出属性中添加分区标记 {client_id}。 当包含各种 client_id 值的数据流经流分析作业时,输出数据根据每个文件夹的单一 client_id 值保存到单独的文件夹中。

显示带有客户端 ID 的路径模式的屏幕截图。

同样,如果作业输入是来自数百万个传感器的传感器数据(其中每个传感器有一个 sensor_id),那么路径模式为 {sensor_id},用于将每个传感器数据分区到不同的文件夹中。

使用 REST API 时,用于该请求的 JSON 文件的输出节可能如下图所示:

显示 REST API 输出的屏幕截图。

作业开始运行后,clients 容器可能如下图所示:

显示客户端容器的屏幕截图。

每个文件夹都可能包含多个 blob,其中每个 blob 包含一个或多个记录。 在前面的示例中,标记为 "06000000" 的文件夹中有一个 blob,其中包含以下内容:

显示 blob 内容的屏幕截图。

请注意,blob 中的每个记录都有一个与文件夹名称匹配的 client_id 列,这是因为用于在输出路径中对输出进行分区的列是 client_id

限制

  1. “路径模式”blob 输出属性中只允许有一个自定义分区键。 以下所有路径模式都有效:

    • cluster1/{date}/{aFieldInMyData}
    • cluster1/{time}/{aFieldInMyData}
    • cluster1/{aFieldInMyData}
    • cluster1/{date}/{time}/{aFieldInMyData}
  2. 如果客户想要使用多个输入字段,他们可以使用 CONCAT 在针对 blob 输出中的自定义路径分区的查询中创建组合键。 示例为 select concat (col1, col2) as compositeColumn into blobOutput from input。 然后,他们可以将 compositeColumn 指定为 Azure Blob 存储中的自定义路径。

  3. 分区键不区分大小写,因此 Johnjohn 等分区键等效。 另外,表达式无法用作分区键。 例如,{columnA + columnB} 无效。

  4. 如果输入流由分区键基数低于 8,000 的记录组成,则这些记录会附加到现有 blob。 它们仅在必要时创建新的 blob。 如果基数超过 8,000,则无法保证写入现有的 blob。 不会为具有相同分区键的任意数量的记录创建新的 blob。

  5. 如果 blob 输出 配置为不可变,则每次发送数据时,流分析都会新建 blob。

自定义 DateTime 路径模式

可以使用自定义 DateTime 路径模式来指定与 Hive 流式处理约定相符的输出格式,这样流分析就可以将数据发送到 Azure HDInsight 和 Azure Databricks 进行下游处理。 自定义 DateTime 路径模式可以轻松地实现,只需在 blob 输出的“路径前缀”字段中使用 datetime 关键字并使用格式说明符即可。 示例为 {datetime:yyyy}

支持的令牌

以下格式说明符令牌可以单独使用,也可以组合使用,以便实现自定义 DateTime 格式。

格式说明符 说明 示例时间 2018-01-02T10:06:08 的结果
{datetime:yyyy} 年份为四位数 2018
{datetime:MM} 月份为 01 到 12 01
{datetime:M} 月份为 1 到 12 1
{datetime:dd} 日期为 01 到 31 02
{datetime:d} 日期为 1 到 31 2
{datetime:HH} 小时为 00 到 23,采用 24 小时格式 10
{datetime:mm} 分钟为 00 到 60 06
{datetime:m} 分钟为 0 到 60 6
{datetime:ss} 秒为 00 到 60 08

如果不希望使用自定义 DateTime 模式,可以将 {date} 和/或 {time} 令牌添加到“路径前缀”字段,从而使用内置的 格式生成下拉列表DateTime

显示流分析的旧 DateTime 格式的屏幕截图。

扩展性和限制

可以在路径模式中使用尽量多的令牌 ({datetime:<specifier>}),直到达到路径前缀字符限制。 在单个令牌中,格式说明符的组合不能超出日期和时间下拉列表已经列出的组合。

对于 logs/MM/dd 路径分区:

有效表达式 无效表达式
logs/{datetime:MM}/{datetime:dd} logs/{datetime:MM/dd}

可以在路径前缀中多次使用同一格式说明符。 令牌每次都必须重复。

Hive 流式处理约定

Blob 存储的自定义路径模式可以与 Hive 流式处理约定配合使用,后者要求文件夹在其名称中使用 column= 进行标记。

示例为 year={datetime:yyyy}/month={datetime:MM}/day={datetime:dd}/hour={datetime:HH}

有了自定义输出,就不需更改表,也不需将分区添加到流分析和 Hive 之间的端口数据。 许多文件夹可以使用以下方式自动添加:

MSCK REPAIR TABLE while hive.exec.dynamic.partition true

示例

根据流分析 Azure 门户快速入门中的说明,创建存储帐户、资源组、流分析作业和输入源。 使用在快速入门中使用的相同示例数据。 此外,GitHub 上也会提供示例数据。

使用以下配置创建 Blob 输出接收器:

显示流分析创建 blob 输出接收器的屏幕截图。

完整路径模式为:

year={datetime:yyyy}/month={datetime:MM}/day={datetime:dd}

启动作业时,会在 Blob 容器中创建基于路径模式的文件夹结构。 可以向下钻取到日级别。

显示使用自定义路径模式的流分析 blob 输出的屏幕截图。