在 dbt-external-tables sideload 期间从 gcp 存储中检索 "filename"?

Retrieve "filename" from gcp storage during dbt-external-tables sideload?

我有一个简单的 9 列报告,我正在通过 dbt-external-tables 模块侧载到 bigquery。

version: 2

sources:
  - name: my_schema
    database: my_project
    loader: gcloud storage

    tables:
      - name: my_table_raw
        description: "external table of reports"
        external:
          location: 'gs://my_bucket/my_reports/*'
          auto_refresh: false
          options:
            format: csv
            skip_leading_rows: 1

到目前为止,此设置的一切都很好,数据导入正确,可查询等。

我的简单补充:将文件名追加为一列最简单的方法是什么?

我尝试了一些效果:

   - name: file_name_column
       expression: metadata$filename
       data_type: string
       description: "the source file name from within gcp"

但看起来 bigquery/模块正在寻找匹配 table 上的列数与文件中的列数,因为我能够“创建”table在 bigquery 中,但是当我查询它时遇到各种错误。

更新:从我在这里看到的情况来看——我在上面看到并尝试使用的“元数据”表达式是特定于雪花的。 Source link.

据我了解,所有指向 Cloud Storage 数据的 BigQuery 外部 tables 都有一个额外的伪列 _FILE_NAME (docs)。无需将其包含在外部 table 定义中,您只需在下游查询即可:

select *,
  _file_name as filename

from {{ source('my_schema', 'my_table_raw') }}

伪列方法可与 Snowflake 的 metadata$filename 和 Redshift 的 $path 相媲美。