ADX V3导出至外部表生成多份小文件的问题咨询
ADX导出多份小文件问题排查
你使用的外部表定义:
.create-or-alter external table <external_table_name> ( field1:string, field2:dynamic, partitiontime:datetime) kind=adl partition by (partitiontime:datetime = bin(partitiontime, 1h)) pathformat = (datetime_pattern("yyyy/MM/dd/HH",partitiontime)) dataformat=parquet ( h@'abfss://mycontainer@mystorage.dfs.core.windows.net/mydir;<storagekey>' )
导出命令:
.export async to table <external_table_name> with (useNativeParquetWriter=true) <| some_custom_function(datetime(2023-02-22T22:38:00Z),1h) | extend partitiontime=ingestion_time()
同一分区生成21份小文件的核心原因,和ADX的分布式执行特性直接相关:
- 查询并行度决定初始文件数量:ADX会将你的查询拆分为多个并行子任务执行(数量由数据分片数、集群节点配置等决定),每个子任务会独立输出一份文件。你看到的21个文件,正好对应此次查询的并行任务数,和文件大小阈值无直接关联。
- 100MB阈值是合并触发条件而非生成限制:默认的100MB阈值,是指当并行生成的文件总大小接近或超过该值时,ADX会尝试合并同分区的小文件。但你的总数据量仅1MB,远低于阈值,合并逻辑不会触发,因此保留了所有并行任务生成的小文件。
- useNativeParquetWriter不影响并行逻辑:该参数仅控制Parquet文件的写入实现,和查询的分布式执行机制无关,所以无论开启或关闭,都会生成对应并行度数量的文件。
如果需要生成单个文件,可针对小数据量场景调整:
- 在导出前强制设置查询并行度为1(会降低执行效率,仅适合小数据量):
set query_fanout_max=1; .export async to table <external_table_name> with (useNativeParquetWriter=true) <| some_custom_function(datetime(2023-02-22T22:38:00Z),1h) | extend partitiontime=ingestion_time() - 导出完成后,手动或通过自动化工具合并同一分区下的小文件。
内容的提问来源于stack exchange,提问作者Dhiraj
相关产品推荐
相关产品推荐

