导入S3中Parquet文件至Snowflake时遇编译内存耗尽错误(4200列)
问题描述
尝试将S3存储桶中的Parquet文件导入Snowflake时,触发以下编译错误:
SQL compilation error:
Compilation memory exhausted.
[SQL: COPY INTO table_name FROM (SELECT $1:col_one::FLOAT, $1:col_two::VARCHAR, ...)
FROM @%source_file.parquet) FILE_FORMAT=(TYPE=parquet) PURGE = TRUE
子查询包含约4200列,将仓库规模从XS调整为M后问题仍未解决;但导入约1000列的数据时,即使使用XS仓库也能正常成功。已确认查询文本大小远小于1MB限制,源文件仅包含短长度的FLOAT和VARCHAR类型,无VARIANT列。
解决方案
使用自动映射替代手动列解析:手动编写4200列的类型转换表达式会让Snowflake在编译阶段消耗大量内存,改用自动映射功能可以避免这个问题。如果目标表结构与Parquet文件列完全匹配,直接执行:
COPY INTO table_name FROM @%source_file.parquet FILE_FORMAT=(TYPE=parquet) PURGE = TRUE;如果需要自动推断表结构,可添加
AUTO_INFER=TRUE参数(需确保目标表不存在,或允许自动创建):COPY INTO table_name FROM @%source_file.parquet FILE_FORMAT=(TYPE=parquet) PURGE = TRUE AUTO_INFER=TRUE;拆分列分批导入:如果必须手动指定列映射,可将4200列拆分为多组,分别导入到临时表,再合并到目标表。例如:
- 创建临时表temp1,导入前2000列:
COPY INTO temp1 FROM (SELECT $1:col1::FLOAT, $1:col2::VARCHAR, ... /* 前2000列 */) FROM @%source_file.parquet FILE_FORMAT=(TYPE=parquet); - 创建临时表temp2,导入剩余2200列:
COPY INTO temp2 FROM (SELECT $1:col2001::FLOAT, $1:col2002::VARCHAR, ... /* 剩余列 */) FROM @%source_file.parquet FILE_FORMAT=(TYPE=parquet); - 将两个临时表的数据合并到目标表(需提前创建包含所有列的目标表):
INSERT INTO table_name SELECT temp1.*, temp2.* FROM temp1 JOIN temp2 ON temp1.unique_key = temp2.unique_key;
- 创建临时表temp1,导入前2000列:
改用Snowpipe加载数据:Snowpipe的编译逻辑与COPY INTO不同,对于超大量列的场景可能更稳定,适合持续自动加载的需求。
内容的提问来源于stack exchange,提问作者tconsta
相关产品推荐
相关产品推荐

