You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加载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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:55:03