2

我正在尝试设置一个简单的 DBT 管道,该管道使用存储在 Azure Data Lake Storage 上的 parquet 表,并创建另一个也将存储在同一位置的表。

在我的models/(定义为我的源路径)下,我有 2 个文件datalake.ymlorders.sql. datalake.yml看起来像这样:

version:2
sources:
   - name: datalake
     tables:
        - name: customers
          external:
             location: path/to/storage1 # I got this by from file properties in Azure
             file_format: parquet
          columns:
             - name: id
               data_type: int
               description: "ID"
             - name: ...

我的orders.sql表如下所示:

{{config(materialized='table', file_format='parquet', location_root='path/to/storage2')}}
select name, age from {{ source('datalake', 'customers') }}

我也在用这个dbt-external-tables包。另请注意,当我运行dbt debug一切正常时,我可以连接到我的数据库(恰好是 Databricks)。

我尝试运行dbt run-operation stage_external_sourceswhich returns Error: staging external sources is not implemented for the default adapter。当我跑步时dbt run,我得到了Error: UnresolvedRelation datalake.customers

或者也许我可以以某种方式使用配置单元元存储?任何有关如何解决此问题的提示将不胜感激!

4

2 回答 2

1

我帮助维护dbt-spark插件和dbt-external-tables包。我可以确认它们的互操作性仍处于初步阶段,我强烈欢迎为改进它做出贡献。我不认为这是一个很大的提升,尽管其中一个挑战是 Spark/Databricks 支持两种不同的create external table语法(如该问题中所述)。

FWIW 我看到您指定path/to/storage为源的外部位置模型的location_root配置orders。前者是从中读取数据的地方后者是将模型具体化为表格的地方。我不确定你的意思是代表相同的占位符还是不同的占位符。

编辑:您可以直接在 SparkSQL 中从某些文件类型中选择 TIL 作为select * from filetype.filepath. 我相信您可以注册以下来源:

version:2
sources:
 - name: datalake
   schema: parquet
   tables:
     - name: customers
       identifier: "path/to/storage1"
       quoting:
         identifier: true

这意味着您可以使用以下模板代码:

select * from {{ source('datalake', 'customers') }}

这将解决:

select * from parquet.`path/to/storage1`
于 2020-08-19T18:55:31.773 回答
1

这可能还不可用。看起来这仍然是一个悬而未决的问题,到目前为止还没有开发工作。

dbt-external-tables包 repo的相关问题:支持 Spark 外部表

你有dbt-spark安装的依赖项吗?

这里有一些相关的问题:

Spark_connection_url 在连接到数据块时不包含 workspace_id

支持Delta Lake格式

我意识到这些对于简单的用例并不完全有帮助,dbt-external-tables但看起来开发仍在继续以支持 azure databricks / datalake 堆栈。

稍后将尝试深入研究这一点,因为这也是一个与我相关的用例。

于 2020-08-19T16:20:05.570 回答