为何Snowflake COPY INTO命令符合条件时仍拆分文件?
Snowflake COPY INTO 小文件异常拆分问题排查与解决
问题场景
执行COPY INTO导出数据时,已配置MAX_FILE_SIZE = 10000000(10MB),待导出数据仅数MB,远小于设定的文件大小限制,同时指定single=false,但Snowflake仍将数据拆分为多个文件,与官方文档中“MAX_FILE_SIZE大于待传输数据量时不会拆分”的描述不符。执行语句如下:
copy into @some-S3-path/some-test5/ from (select 'abcd') FILE_FORMAT = (TYPE = 'CSV' COMPRESSION = 'NONE' FIELD_OPTIONALLY_ENCLOSED_BY = '"') MAX_FILE_SIZE = 10000000 overwrite = False single=false include_query_id = False detailed_output = false header = True;
可能原因及对应解决方法
- 虚拟仓库并行度触发拆分:Snowflake导出依赖虚拟仓库的计算节点并行处理,即使数据量小,若虚拟仓库节点数(如XS规格默认2节点)大于1,每个节点可能独立生成文件。
- 解决:临时切换为单节点虚拟仓库(如指定
WAREHOUSE = XS_SINGLE)后执行导出,降低并行度。
- 解决:临时切换为单节点虚拟仓库(如指定
- CSV表头的并行输出干扰:开启
header = True后,并行处理时每个节点会单独输出表头,进而生成多个小文件。- 解决:要么先导出无表头数据,再单独上传表头文件;若业务允许,改用
single=true强制生成单个文件。
- 解决:要么先导出无表头数据,再单独上传表头文件;若业务允许,改用
- 会话级参数缓存残留:此前设置过
MAX_FILE_SIZE=5GB,会话内可能存在参数缓存,未完全覆盖新设置。- 解决:开启新会话执行导出,或先执行
ALTER SESSION UNSET MAX_FILE_SIZE;清除会话缓存后再运行COPY INTO。
- 解决:开启新会话执行导出,或先执行
- 目标路径文件残留影响:目标S3路径下若存在历史小文件,可能干扰Snowflake的文件生成判断。
- 解决:清空目标路径所有文件后重新执行导出,验证是否仍会拆分。
内容的提问来源于stack exchange,提问作者Yotam Levy
相关产品推荐
相关产品推荐

