【问题标题】:How to configure DBT sources from Big Query EXTERNAL_QUERY如何从 Big Query EXTERNAL_QUERY 配置 DBT 源
【发布时间】:2021-07-06 15:36:06
【问题描述】:

在 Big Query 中,我使用了一个外部连接/联合 SQL 查询 (cloudSQL),我可以使用 SELECT * FROM EXTERNAL_QUERY("gcp-name.europe-west3.friendly_name", "SELECT * FROM database_name.external_table;") 从中获取数据

现在我的问题是,在 DBT 中,如何在我的 schema.yml 文件中定义这个源以及我的 FROM {{source(...,...)}} 语句应该是什么样子?

【问题讨论】:

  • 嗨@andreas030241,当您说“外部源”时,您指的是BigTable 还是CloudSQL?从我在docs 中看到的情况来看,这些是唯一受支持的来源,但我想确认一下。
  • 也可以在dbt-external-tables/issues 上打开一个问题来描述新的来源?我认为这需要一个新的“加载器”来处理 sql 外部源,而不仅仅是文件湖样式的外部源。
  • 嗨 @sgoley 我指的是 CloudSQL 表

标签: google-bigquery dbt


【解决方案1】:

从我现在的角度来看,鉴于我以上关于 dbt-external-tables 包的当前状态的 cmets(我认为它不能满足您的需求),我会说您有两个选择:

  1. 将您的外部依赖项定义为自定义架构中的静态视图,然后作为 dbt 源导入。

  2. 使用Evaluate(<select *>)ref() 之类的东西 dbt 中定义您的外部依赖项,然后在您的变换/舞台层中使用类似的东西。


#1 示例

* my-bq-project-id
  |
  |_ dbt_schema
  | 
  |_ external_db_schema
    |
    |_ external_table_1
    |_ external_table_2

等等。 然后你会有:

* my-dbt-project-dir
  |
  |_ analysis
  |_ data
  |_ models
  |  |_ sources
  |  | |
  |  | |> my_external_table_1.yml
  |  | |> my_external_table_2.yml
  |  |
  |  |_ transforms
  |  |_ final
  |_ dbt_project.yml
  |_ readme.md

“my_external_table_1.yml”的样子:

sources:
  - name: external_db_schema
    database: my-bq-project-id
  
    tables:
      - name: my_external_table_1
        description: "Lorem Ipsum"

您的静态视图是通过运行如下查询来定义的:

create view if not exists `my-bq-project-id.external_db_schema.my_external_table_1` as 
( SELECT * FROM EXTERNAL_QUERY("gcp-name.europe-west3.friendly_name",
  "SELECT * FROM database_name.external_table;"))

#2 示例

只需制作一个基本级别的 dbt 模型,该模型完全符合您在 1-1 对象映射中所描述的内容:

my_external_table_1.sql

execute immediate (
  SELECT * FROM EXTERNAL_QUERY("gcp-name.europe-west3.friendly_name",
  "SELECT * FROM database_name.external_table;")
)

然后从这里你将能够在你的变换层等中ref('my_external_table_1')

【讨论】:

  • 感谢您的回复!据我了解解决方案 1,每当my_external_table_1 发生变化时,我都必须运行查询来创建静态视图,对吧?不幸的是,这不是我需要的。我想我现在会使用您的解决方案 2,即使它不适合文档。一个问题——你为什么使用execute immediate ()?我的 DBT 无法做到这一点,我想知道它的功能。
  • 我使用了execute immediate (),因为我不确定EXTERNAL_QUERY() 函数调用中引用的select 语句在给定dbt 时的执行情况。我之前尝试过将 select 语句作为字符串传递,唯一的解决方案是在 execute immediate () 函数调用中。
  • 您能否再解释一下“您的 DBT 无法做到这一点”是什么意思?
  • 抱歉,我对 DBT 和 SQL 还是很陌生。因此,当尝试使用execute immediate () 运行模型时,DBT 给了我这个错误:“语法错误:预期的“(”或关键字 SELECT 或关键字 WITH 但在 [6:6] 处得到关键字 EXECUTE”。所以对我来说它看起来像DBT 不知道那个命令。
  • @andreas030241 你能解决它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2017-09-10
  • 1970-01-01
相关资源
最近更新 更多