如何通过Azure Event Hubs将数据自动写入Azure Data Explorer多表?
通过Azure Event Hubs向ADX多表写入数据的实现方案
问题根源
你之前将KQL的.ingest命令直接发送到Event Hubs,但ADX与Event Hubs的连接是原始数据 ingestion 管线,不支持解析KQL命令,这是导致BadRequest_InvalidBlob错误的核心原因。
正确实现步骤
1. 配置ADX的Event Hubs动态表路由
针对70个预定义表的场景,无需创建70个独立的Event Hubs连接,只需在现有连接中开启动态表路由:
- 登录Azure门户,进入ADX集群的数据连接页面,找到对应的Event Hubs连接
- 在路由设置中,选择通过Event Hubs消息属性或数据内容字段指定目标表:
- 推荐用消息属性路由:设置路由键为
TableName(自定义属性名),ADX会根据消息的TableName属性值自动匹配预定义表 - 若用数据内容路由(如CSV第一列、JSON字段),需确保每条数据包含目标表标识,且ADX配置中指定对应字段
- 推荐用消息属性路由:设置路由键为
2. 优先采用CSV格式发送数据
CSV格式的发送规范需严格匹配ADX目标表的schema:
- 每条Event Hubs消息对应一个表的数据集,列顺序、数据类型必须与目标表完全一致
- 无需添加CSV表头(若带表头,需在ADX数据连接中开启
SkipFirstRecord) - 示例CSV内容(对应
LicenseInfo表):1701079234,State,123,2024-12-31 - 发送消息时需设置:
- 自定义属性
TableName=LicenseInfo(匹配ADX预定义表名) - 消息
ContentType=text/csv
- 自定义属性
3. JSON格式备选方案
若需用JSON发送,直接发送纯数据而非KQL命令:
- 每条消息可发送单条JSON对象或JSON数组(批量数据)
- 示例JSON内容:
{"Time":1701079234,"LicensingState":"State","LicenseCountTotal":123,"MaintenanceEnd":"2024-12-31"} - 发送时设置:
- 自定义属性
TableName=LicenseInfo - 消息
ContentType=application/json
- 自定义属性
4. 错误排查要点
- 验证ADX数据连接配置:确认动态路由规则正确,目标表已存在且schema匹配
- 检查数据格式:CSV列数、JSON字段名(大小写敏感)必须与目标表完全一致
- 查询ADX ingestion日志:执行以下KQL获取详细错误信息
.show ingestion failures | where FailedOn > ago(1h)
内容的提问来源于stack exchange,提问作者Dieter Schmitz
相关产品推荐
相关产品推荐

