dbt dremio 项目代码结构简单说明

以前简单介绍过dremio dbt 扩展的特点,以下说明下代码结构

参考代码结构

dbt
├── adapters
└── dremio
├── __init__.py
├── __version__.py
├── api
├── __init__.py
├── authentication.py
├── cursor.py
├── handle.py
├── parameters.py
└── rest
├── endpoints.py
├── error.py
└── url_builder.py
├── connections.py
├── credentials.py
├── impl.py
└── relation.py
└── include
    └── dremio
        ├── __init__.py
        ├── dbt_project.yml
        ├── macros
        ├── adapters
        ├── apply_grants.sql
        ├── columns.sql
        ├── data_preparation.sql
        ├── external_query.sql
        ├── format.sql
        ├── metadata.sql
        ├── relation.sql
        ├── snapshot.sql
        ├── sources.sql
        └── timestamp.sql
        ├── builtins
        └── builtins.sql
        ├── get_custom_name
        ├── get_custom_alias.sql
        ├── get_custom_database.sql
        ├── get_custom_schema.sql
        └── is_datalake_node.sql
        ├── materializations
        ├── helpers.sql
        ├── incremental
        ├── incremental.sql
        ├── strategies.sql
        └── validate.sql
        ├── reflection
        ├── create_reflection.sql
        ├── helpers.sql
        └── reflection.sql
        ├── seed
        ├── helpers.sql
        └── seed.sql
        ├── table
        ├── alter_pds.sql
        ├── create_table_as.sql
        └── table.sql
        ├── twin_strategy.sql
        └── view
        ├── create_or_replace_view.sql
        ├── create_view_as.sql
        ├── helpers.sql
        └── view.sql
        └── utils
        ├── array_append.sql
        ├── array_concat.sql
        ├── array_construct.sql
        └── data_types.sql
        └── profile_template.yml

简单说明

  • 代码部分
    dbt/adapters/dremio 这部分属于dbt 标准开发套路,而且必须是按照此目录布局,因为dbt 的adapter 动态加载就基于了此路径
    注意此目录下需要包含一个__init__.py 以及__version__.py init.py 是标准的模块加载的,同时里边定义了一个Plugin 的变量
    里边是adapter 插件具体的处理
    参考代码
Plugin = AdapterPlugin(
    adapter=DremioAdapter,  # 实际SQLAdapter的一个实现,包含了sql 处理相关的,当然还有连接处理的,api 目录里边模块的包装
    credentials=DremioCredentials, # 认证,链接配置信息
    include_path=dremio.PACKAGE_PATH, # macro 路径信息
)

dbt/adapters/dremio/api 部分,就是api 包装的dremio 数据访问操作(基于http协议)

  • include 部分
    实际上可以比较随意处理,官方为了符合标准,按照dbt/include/dremio 格式命名了,注意dremio目录下需要一个__init__.py 的多文件
    核心是提供一个方便知道模块提供macro 加载地址的模块,AdapterPlugin 类中需要
    init.py 参考代码(此代码基本所有adapter 都类似)
import os
 
PACKAGE_PATH = os.path.dirname(__file__)

其他子文件夹,这个实际上是按照了dbt global macro 的一个实践(dbt-adapters 包中的)里边主要是对于global macro 的一些重写
以及扩展(比如dremio 自己的反射物化方案以及基于CTAS 的物化方案)一个参考macro 注意覆盖的macro 格式需要是
<adapter>__<global_macro_name> 的,dbt 在进行处理的时候会进行adapter.dispatch 进行处理

{% macro dremio__generate_schema_name(custom_schema_name, node) -%}
  {%- set default_schema = target.schema if not is_datalake_node(node)
    else target.root_path -%}
  {%- set custom_schema_name = custom_schema_name if not is_datalake_node(node)
    else node.config.root_path -%}
  {{ generate_schema_name_impl(default_schema, custom_schema_name, node) }}
{%- endmacro %}

global macro 参考如下

说明

以上是从代码结构上进行一个简单的说明,详细的实现建议结合源码学习

参考资料

https://docs.getdbt.com/guides/adapter-creation?step=1
https://github.com/dbt-labs/dbt-adapters
https://github.com/dremio/dbt-dremio
https://docs.getdbt.com/guides/create-new-materializations?step=2
https://docs.getdbt.com/reference/dbt-jinja-functions/config
https://docs.getdbt.com/reference/resource-configs/pre-hook-post-hook
https://docs.getdbt.com/reference/dbt-jinja-functions/builtins
https://github.com/dbt-labs/dbt-common
https://github.com/dremio/dbt-dremio/blob/main/dbt/include/dremio/macros/adapters/columns.sql
https://github.com/dremio/dbt-dremio/blob/main/dbt/include/dremio/dbt_project.yml

posted on 2024-04-03 00:49  荣锋亮  阅读(14)  评论(0编辑  收藏  举报

导航