使用ID分区创建Azure Data Explorer外部表时ID列为何为空?
问题原因及最优解决方案
原因分析
你遇到的ID列值为空的问题,核心是分区列的映射规则:
- 你定义的
ID列默认是从Parquet文件内部的字段读取,但你的Parquet文件里并没有这个字段,所以显示为空。 - 路径中的
ID=X/ID=Y属于存储路径分区参数,Kusto不会自动把这类路径参数映射到表定义的同名列,必须显式配置绑定关系。
你创建ID2列并在路径中引用能生效,是因为用@ID2显式把路径分区参数和ID2列做了绑定,但这属于绕路的方式,并非最优解。
最优解决方案
不需要新增列,直接通过partition by子句将路径分区参数绑定到原有的ID列即可,修改后的KQL语句如下:
.create external table TESTS (Key: string, Value: string) kind=adl dataformat=parquet partition by ID string ( h@'abfss://gold@dev.dfs.core.windows.net/db/1/ID=@ID;impersonate', h@'abfss://gold@dev.dfs.core.windows.net/db/1/ID=@ID;impersonate' )
关键修改点说明
- 移除表定义中的ID列:因为ID已经通过
partition by声明为分区列,不需要再作为文件内字段定义。 - 添加
partition by ID string:明确ID是分区列,指定其数据类型为string。 - 路径中的
ID=X/ID=Y改为ID=@ID:将路径中的分区占位符与表的ID列绑定,Kusto会自动把每个路径对应的X、Y值填充到ID列中。
执行上述语句后,查询外部表时ID列就会正确显示X或Y的值,同时Key和Value列也能正常读取文件内的字段。
内容的提问来源于stack exchange,提问作者LJRB
相关产品推荐
相关产品推荐

