DBT+Snowflake内部存储报错:文件格式GA4_GCS_PARQUET_FM不存在或未授权
问题描述
在Snowflake中,我有一个存储Parquet文件的内部stage,尝试用以下DBT代码执行SELECT查询:
WITH GA4_RAW_DATA AS ( SELECT $1::VARIANT AS RAW_DATA, METADATA$FILE_LAST_MODIFIED AS LAST_MODIFIED, METADATA$filename AS STG_FILE_NAME FROM @{{schema}}.GA4_GCS_IS_PARQUET WHERE METADATA$FILENAME like '%events_%' {% if is_incremental() %} where LAST_MODIFIED not in ( select LAST_MODIFIED from {{this}} ) {% endif %} )
虽然能访问Parquet文件,但遇到如下错误:
15:26:38 Database Error in model raw_all_events (models\Raw\raw_all_events.sql) 15:26:38 002003 (02000): SQL compilation error: 15:26:38 File format 'GA4_GCS_PARQUET_FM' does not exist or not authorized. 15:26:38 compiled SQL at target\run\cdp_ga4\models\Raw\raw_all_events.sql
我已检查文件格式权限,确认角色CDP_GA4_DEV_CONTRIBUTOR_ROLE拥有该文件格式的所有权和使用权限;同时修改了PROFILE.YML文件,尝试配置:
privileges: all
或
privileges: - on: file format GA4_GCS_PARQUET_FM to: role CDP_GA4_DEV_CONTRIBUTOR_ROLE privileges: [SELECT, COPY, READ]
但问题仍未解决,求解决建议。
解决建议
- 检查文件格式的完整限定引用:确保文件格式使用
数据库名.架构名.GA4_GCS_PARQUET_FM的完整路径。如果stage未关联默认文件格式,查询时需显式指定,修改FROM子句为:FROM @{{schema}}.GA4_GCS_IS_PARQUET (FILE_FORMAT => {{schema}}.GA4_GCS_PARQUET_FM) - 验证stage与文件格式的关联配置:查看stage的定义,确认是否已绑定目标文件格式。执行以下SQL检查:
若输出中DESCRIBE STAGE {{schema}}.GA4_GCS_IS_PARQUET;FILE_FORMAT字段未指向GA4_GCS_PARQUET_FM,需重新修改stage配置:ALTER STAGE {{schema}}.GA4_GCS_IS_PARQUET SET FILE_FORMAT = (FORMAT_NAME = {{schema}}.GA4_GCS_PARQUET_FM); - 确认角色激活状态:确保DBT运行时使用的角色确实是
CDP_GA4_DEV_CONTRIBUTOR_ROLE。可在profile.yml中明确指定角色,或手动执行USE ROLE CDP_GA4_DEV_CONTRIBUTOR_ROLE;后测试查询。 - 手动验证文件格式的可访问性:用目标角色执行以下SQL,确认文件格式存在且可访问:
如果报错,说明角色权限仍有问题,需重新授予权限(注意要指定完整的对象路径):DESCRIBE FILE FORMAT {{schema}}.GA4_GCS_PARQUET_FM;GRANT USAGE ON FILE FORMAT {{schema}}.GA4_GCS_PARQUET_FM TO ROLE CDP_GA4_DEV_CONTRIBUTOR_ROLE; - 检查DBT编译后的SQL:打开target目录下的
raw_all_events.sql文件,确认生成的SQL中文件格式的引用是否正确,是否遗漏了数据库或架构前缀。
内容的提问来源于stack exchange,提问作者Catarina Ribeiro
相关产品推荐
相关产品推荐

