Snowflake查询Stage中Parquet半结构化数据报错原因
Snowflake查询Stage内Parquet数据两种写法报错原因
场景复现
- 提前创建命名文件格式对象:
create or replace file format parq1 type='PARQUET';
- 名为
sampleparquet的Stage中存储了Parquet格式半结构化数据,以下SQL可正常执行返回结果:
select $1 from @sampleparquet (file_format=>parq1 );
- 以下两种写法执行时会触发SQL编译错误,无法返回有效数据:
- 尝试内联传入格式参数的写法:
select $1 from @sampleparquet (file_format=>(type='PARQUET'));- 尝试用等号传参引用命名格式的写法:
select $1 from @sampleparquet (file_format= parq1 );
具体报错原因
这两个错误都和Snowflake直接查询Stage数据的语法强约束有关:
直接通过SELECT $1 FROM @stage名 (...)的方式查询Stage文件时,括号内传入的是查询阶段的可选控制参数,有两个不可违反的语法规则:
- 所有参数必须使用命名参数专用赋值符
=>传值,不支持用等号=赋值 - 其中
file_format参数仅支持传入提前创建好的命名文件格式对象的标识符,不支持在该位置内联写文件格式配置参数(内联配置的写法仅在COPY INTO命令、创建/修改Stage的语句中支持)
两种错误写法分别触发了对应的规则:
- 第一种写法违反了第二条规则:你在
file_format=>后传入了括号包裹的内联格式配置(type='PARQUET'),解析器会默认把=>后的内容当成已存在的文件格式对象名去检索,不存在对应名称的对象,同时该位置本身不支持内联格式配置,因此直接抛出编译错误。 - 第二种写法违反了第一条规则:你用等号
=给file_format参数传值,不符合该位置参数必须用=>赋值的语法要求,解析器无法识别等号后的参数结构,因此直接抛出编译错误。
补充说明:如果需要在内联指定格式参数的情况下查询Parquet数据,有两种合规方案:
- 提前创建对应配置的命名文件格式,查询时用
file_format=>格式名的方式引用- 先创建或修改Stage,在Stage属性中绑定对应配置的文件格式,查询时不需要额外传
file_format参数
内容的提问来源于stack exchange,提问作者MastanSky
相关产品推荐
相关产品推荐

