在 dbt-external-tables 旁加载期间从 gcp 存储中检索“文件名”?

问题描述

我有一个简单的 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 / 模块希望将表中的列数与文件中的列数相匹配,因为我能够在 bigquery 中“创建”表,但是当我遇到各种错误时对其进行查询

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

解决方法

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

select *,_file_name as filename

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

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