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