使用Azure Data Explorer时能否在ingestion mapping中转换数据?
结论
Kusto(Azure Data Explorer)的原生JSON ingestion mapping 不支持在映射配置中直接执行函数类转换逻辑,你写的两种拆分写法都无法生效。
现有配置的问题
ConstantValue属性仅用于注入静态固定值,不会解析执行其中的表达式,你写入的$.split(Name, "_")[1]会被当作普通字符串直接存入Name1列,不会做拆分运算。Path属性仅支持指定JSON源中已存在的节点路径,不支持嵌入函数逻辑,你写的$[' split(Name, "_")[1]']会被识别为「查找键名等于split(Name, "_")[1]的JSON节点」,根本取不到拆分后的值。
标准实现方案
生产环境下这类入库时的字段转换,统一用**更新策略(Update Policy)**实现,步骤如下:
- 新建一张临时落地表(staging表),字段和原始JSON结构完全对齐,只保留源数据里存在的字段,去掉你要拆分生成的Name1~Name8列,给这张表配置修正后的JSON ingestion mapping。
- 新建最终业务查询用的目标表,包含所有原始字段+你要生成的Name1~Name8拆分列。
- 给目标表绑定更新策略,指定数据从staging表流入时自动执行拆分逻辑,转换后写入目标表。
参考实现代码:
// 1. 创建临时落地表 .create table example_staging ( timestamp: datetime, rawValue: dynamic, Name: string, RelevantData: dynamic ) // 2. 给落地表配置正确的JSON映射(删除所有无效的拆分字段配置) .create table example_staging ingestion json mapping "example_staging_mapping" '[' '{"column":"timestamp", "Properties": {"Path":"$.timestamp"}},' '{"column":"rawValue", "Properties":{"Path":"$.rawValue"}},' '{"column":"Name", "Properties":{"Path":"$.Name"}},' '{"column":"RelevantData", "Properties":{"Path":"$.RelevantData"}}' ']' // 3. 创建最终目标表 .create table example ( timestamp: datetime, rawValue: dynamic, Name: string, Name1: string, Name2: string, Name3: string, Name4: string, Name5: string, Name6: string, Name7: string, Name8: string, RelevantData: dynamic ) // 4. 配置更新策略,自动拆分Name字段 .alter table example policy update @'[{ "IsEnabled": true, "Source": "example_staging", "Query": """ example_staging | extend NameParts = split(Name, "_") | extend Name1 = tostring(NameParts[0]), Name2 = tostring(NameParts[1]), Name3 = tostring(NameParts[2]), Name4 = tostring(NameParts[3]), Name5 = tostring(NameParts[4]), Name6 = tostring(NameParts[5]), Name7 = tostring(NameParts[6]), Name8 = tostring(NameParts[7]) | project-away NameParts """, "IsTransactional": true, "PropagateIngestionProperties": true }]' // 可选:配置落地表短保留期,避免冗余存储占用 .alter table example_staging policy retention @'{"SoftDeletePeriod": "1.00:00:00", "Recoverability": "Disabled"}'
注意事项
split()函数返回的数组索引从0开始,示例中是取拆分后的第1到第8个分段,如果你实际需要跳过第一个分段,自行调整数组索引即可。- 如果Name字段按
_拆分后的段数不足8段,对应位置的NameN列会自动存为空值,无需额外处理。 - 如果你是单次临时入库,也可以在执行入库命令时直接带KQL查询做拆分,但不适合持续的自动化接入场景。
内容的提问来源于stack exchange,提问作者Diego7Perez
相关产品推荐
相关产品推荐

