【问题标题】:Using external parquet tables in a DBT pipeline在 DBT 管道中使用外部 parquet 表
【发布时间】:2020-12-08 22:38:51
【问题描述】:

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

在我的models/(定义为我的源路径)下,我有两个文件datalake.ymlorders.sqldatalake.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_sources,它返回Error: staging external sources is not implemented for the default adapter。当我运行dbt run 时,我得到Error: UnresolvedRelation datalake.customers

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

【问题讨论】:

    标签: apache-spark hive parquet dbt


    【解决方案1】:

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

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

    编辑: TIL,您可以直接在 SparkSQL 中从某些文件类型中选择 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`
    

    【讨论】:

    • 感谢您对此进行调查,杰里米,我非常感谢。我更新了我原来的问题,以反映源和目标中的path/to/storage 是不同的位置。我仍然认为自己是 DBT 的初学者,但我喜欢这个工具,我会看看我(或我的团队)是否可以在这里做出贡献。
    • 还有一个问题:在没有合适的解决方案的情况下,用select a,b from parquet.'path/to/file'注册外部表作为视图而不使用{{ref()}}有什么缺点吗?
    • 这种方法没有真正的缺点!我不知道您可以直接根据 SparkSQL 中的路径从 parquet 文件中进行选择。这太酷了。我将在上面编辑我的答案,以包含一种仍然利用资源的方法。
    • 太棒了!嗯,这意味着问题确实解决了:)
    • @JeremyCohen 有没有办法使用这种方法使用新鲜度报告?因为我得到的错误是它无法找到视图/表 hive_metastore.parquet.{path}.
    【解决方案2】:

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

    dbt-external-tables 软件包回购的相关问题:Support Spark external tables

    您是否安装了来自 dbt-spark 的依赖项?

    这里有一些相关的问题:

    Spark_connection_url do not contain workspace_id while connecting to databricks

    Support Delta Lake format

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

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

    【讨论】:

    • 感谢您分享您的想法!我的计划 B 是为我的外部表创建视图 select a,b from parquet.path/to/file`` 这可行,但并不理想。我希望我可以在 yaml 中定义这些外部依赖项,但正如您所说,它可能仍在积压中。
    猜你喜欢
    • 2023-01-16
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2022-01-05
    • 2020-10-28
    • 1970-01-01
    • 2021-11-06
    • 2019-10-13
    相关资源
    最近更新 更多