无需Lambda函数,Snowflake如何读取压缩文件夹内的TSV文件?
Snowflake读取多文件压缩包的原生方案
Snowflake目前支持原生读取包含多文件的压缩包内的目标TSV文件,无需借助Lambda函数解压,具体实现方法如下:
核心前提确认
首先需要明确你的school.tsv.gz实际是tar.gz格式(即先将包含event.tsv和country.tsv的文件夹打包成tar,再压缩为gz)——因为标准的.gz压缩仅支持单个文件,无法直接压缩文件夹。Snowflake原生支持解析这种嵌套的归档压缩格式。
配置文件格式
确保你已创建的TSV_FILE_Format配置正确:
- 将
COMPRESSION参数设置为AUTO,Snowflake会自动识别gz、tar.gz等压缩类型;也可直接指定COMPRESSION = 'GZIP'(针对tar.gz格式同样有效)。 - 保留TSV相关配置,例如
FIELD_DELIMITER = '\t'、SKIP_HEADER = 1等适配你的文件内容。
加载目标文件的两种方式
1. 使用PATTERN参数筛选文件名
在COPY INTO语句或Snowpipe定义中,通过PATTERN正则匹配目标TSV文件:
-- 加载event.tsv到对应表 COPY INTO event_table FROM @your_school_stage/school.tsv.gz FILE_FORMAT = (FORMAT_NAME = 'TSV_FILE_Format') PATTERN = '.*event\\.tsv'; -- 加载country.tsv到对应表 COPY INTO country_table FROM @your_school_stage/school.tsv.gz FILE_FORMAT = (FORMAT_NAME = 'TSV_FILE_Format') PATTERN = '.*country\\.tsv';
2. 利用元数据列$FILE_NAME过滤
通过子查询结合元数据列精准筛选目标文件:
COPY INTO event_table FROM ( SELECT $1, $2, $3 -- 替换为event_table对应的列 FROM @your_school_stage/school.tsv.gz WHERE $FILE_NAME = 'event.tsv' ) FILE_FORMAT = (FORMAT_NAME = 'TSV_FILE_Format');
Snowpipe适配
创建Snowpipe时,只需将上述筛选逻辑整合到管道的COPY定义中即可,Snowpipe会自动扫描压缩包内的目标文件并触发加载,无需额外解压步骤。
注意事项
- 确认你的Snowflake账户版本支持归档压缩包解析(当前主流商业版均已支持)。
- 若压缩包不是tar.gz格式,而是错误地将文件夹直接压缩为gz(这种操作通常依赖特定工具,并非标准gz格式),则需要重新生成标准的tar.gz压缩包,才能被Snowflake原生解析。
内容的提问来源于stack exchange,提问作者Abiodun Adeoye
相关产品推荐
相关产品推荐

