加载AVRO文件至Snowflake遇报错的技术咨询及解决记录
Snowflake加载AVRO文件的问题与解决方法
问题背景
我有一个AVRO文件,其Schema如下:
{ "type":"record", "name":"row", "fields": [ {"name":"Column1","type":"int"}, {"name":"Column2","type":"string"} ] }
尝试从已暂存的文件中读取数据,执行SQL语句:
SELECT t.$1 FROM @my_stage/my_file.avro ( FILE_FORMAT => 'MY_AVRO' ) t ;
触发错误:
AVRO file format can produce one and only one column of type variant, object, or array. Load data into separate columns using the MATCH_BY_COLUMN_NAME copy option or copy with transformation.
使用INFER_SCHEMA、METADATA$FILE_ROW_NUMBER等函数排查时,仍出现相同错误。疑问如下:
- 是否可以加载此类AVRO文件?
- 若不可行,该如何修改AVRO Schema?
- Snowflake对AVRO文件有哪些要求?
解答
1. 此类AVRO文件可正常加载
你的AVRO Schema本身符合Snowflake的要求,错误并非来自Schema本身,而是读取方式的限制。
2. Snowflake对AVRO文件的核心要求
- 直接查询暂存区的AVRO文件时,Snowflake默认会将整个AVRO record解析为单个
VARIANT/OBJECT类型的列(即$1),无法直接返回多列,这是你触发错误的原因。 - 若要将AVRO数据映射到多列结构,需通过
COPY INTO语句配合MATCH_BY_COLUMN_NAME选项,或确保暂存区配置与目标表结构匹配。
3. 可行的加载/查询方式
方式一:通过COPY INTO加载到表
先创建与AVRO Schema匹配的表,再用COPY INTO指定列名匹配:
CREATE TABLE my_table ( Column1 INT, Column2 STRING ); COPY INTO my_table FROM @my_stage/my_file.avro FILE_FORMAT => 'MY_AVRO' MATCH_BY_COLUMN_NAME => CASE_INSENSITIVE;
方式二:直接查询时解析单列为多列
如果只是临时查询,可直接解析$1中的字段:
SELECT t.$1:Column1::INT AS Column1, t.$1:Column2::STRING AS Column2 FROM @my_stage/my_file.avro ( FILE_FORMAT => 'MY_AVRO' ) t;
最终解决方法
通过重新创建适配对应表类型的暂存区,成功加载了该文件。
内容的提问来源于stack exchange,提问作者Alsin
相关产品推荐
相关产品推荐

