能否在DBT Source YML中引用Snowflake内部Stage?
目前无法直接在dbt的Source YML文件中引用Snowflake内部Stage——你提到的dbt-external-tables模块确实只支持外部Stage,内部Stage不在其功能覆盖范围内。不过可以通过以下几种方式实现你的需求:
手动创建外部表关联内部Stage,再在dbt中引用
先在Snowflake控制台或通过dbt的run-operation执行SQL,创建关联内部Stage的外部表:CREATE OR REPLACE EXTERNAL TABLE my_db.my_schema.internal_stage_ext_table WITH LOCATION = @my_db.my_schema.my_internal_stage/ FILE_FORMAT = (TYPE = CSV FIELD_OPTIONALLY_ENCLOSED_BY = '"' SKIP_HEADER = 1) AUTO_REFRESH = TRUE;之后在dbt的Source YML中直接引用这个外部表,和引用普通表完全一致:
sources: - name: my_source schema: my_schema database: my_db tables: - name: internal_stage_ext_table description: "外部表关联Snowflake内部Stage,用于解析CSV数据"这种方式能让你在dbt模型中直接查询该表,同时获取Snowflake自带的元数据字段(比如
METADATA$FILENAME、METADATA$FILE_ROW_NUMBER)。用dbt宏自动生成关联内部Stage的外部表
如果你希望把创建逻辑集成到dbt工作流中,可以写一个自定义宏:{% macro create_internal_stage_ext_table(table_name, stage_name, file_format_name) %} CREATE OR REPLACE EXTERNAL TABLE {{ target.schema }}.{{ table_name }} WITH LOCATION = @{{ target.schema }}.{{ stage_name }}/ FILE_FORMAT = (FORMAT_NAME = {{ target.schema }}.{{ file_format_name }}) AUTO_REFRESH = TRUE; {% endmacro %}然后在dbt项目中通过
dbt run-operation create_internal_stage_ext_table --args '{table_name: "my_ext_table", stage_name: "my_internal_stage", file_format_name: "my_csv_format"}'执行宏,创建完成后就能在Source YML或模型中引用。直接在dbt模型中查询内部Stage
如果不需要持久化的外部表,也可以直接在模型SQL中读取内部Stage的文件:SELECT $1::VARCHAR AS user_id, $2::DATE AS event_date, METADATA$FILENAME AS source_file, METADATA$FILE_ROW_NUMBER AS row_position FROM @my_db.my_schema.my_internal_stage/ (FILE_FORMAT => 'my_csv_format');这种方式适合临时分析或数据量较小的场景,每次运行模型都会扫描Stage内的文件。
内容的提问来源于stack exchange,提问作者tacou_st

