lokin
08/14/2025, 9:25 AM# Required from dbt 1.8 and above for certain Elementary features
flags:
require_explicit_package_overrides_for_builtin_materializations: False
source_freshness_run_project_hooks: True
models:
elementary_project:
materialized: "{{ 'table' if target.name == 'prod-cloud' else 'view' }}"
elementary:
+schema: "elementary"kapa.ai
08/14/2025, 9:25 AMkapa.ai
08/14/2025, 9:25 AMrequire_explicit_package_overrides_for_builtin_materializations: False - 这个配置是从 dbt 1.8 开始引入的。它允许像 Elementary 这样的第三方 dbt package 覆盖 dbt 内置的 materialization(如 table、incremental 等)。如果不加这个配置,Elementary 的某些功能(比如收集 dbt 测试的失败行数和样本)将无法正常工作。加上这个配置后,虽然会有一个 dbt 的弃用警告,但 Elementary 相关功能可以正常使用【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】。 - source_freshness_run_project_hooks: True - 这个配置同样是针对 dbt 1.8 及以上版本。它允许 Elementary 自动收集 dbt source-freshness 的结果,并像其他 test 结果一样进行处理和展示【[官方文档说明](https://docs.elementary-data.com/oss/guides/collect-dbt-source-freshness)】。 ### models 配置 - elementary_project: - materialized: "{{ 'table' if target.name == 'prod-cloud' else 'view' }}" - 这是你自定义项目(如 elementary_project)下所有模型的 materialization 策略:如果运行环境是 prod-cloud,则物化为 table,否则为 view。注意,这个配置不要影响到 elementary 包,否则会导致 Elementary 的模型无法正常创建【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】。 - elementary: - +schema: "elementary" - 这表示 Elementary 包的所有模型会被创建在名为 elementary 的 schema 下。建议 Elementary 的模型单独放在一个 schema 里,避免和你自己的模型混淆【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】。 --- 总结: 这些配置主要是为了让 Elementary 在 dbt 1.8 及以上版本下能够正常收集测试结果、source freshness,并且保证 Elementary 的模型不会被全局 materialization 策略影响,且单独存放在 elementary schema 下。lokin
08/14/2025, 9:38 AMkapa.ai
08/14/2025, 9:38 AMkapa.ai
08/14/2025, 9:38 AMdbt_project.yml 中为 elementary 包单独指定 database 和 schema,把 Elementary 的表写入 Snowflake 的另一个数据库**,例如: yaml models: elementary: +database: 你的_elementary_数据库名 +schema: elementary 注意事项: - 你还需要在 Elementary CLI(即 elementary profile)中配置相同的 database 和 schema,这样 edr 工具才能正确读取 Elementary 的表【[Slack 讨论1](https://slack.com/archives/C02CTC89LAX/p1686886234811099)】【[Slack 讨论2](https://slack.com/archives/C02CTC89LAX/p1670857782412889)】。 - 这种方式仅支持将 Elementary 的表放在同一个数据仓库(如 Snowflake)下的不同数据库,不支持跨不同类型的数据仓库(比如主仓库在 Snowflake,Elementary 在 Postgres),因为 dbt 只支持单一 target 运行,不能跨 host 或跨数据仓库写入【[Slack 讨论3](https://slack.com/archives/C02CTC89LAX/p1696319334450099)】【[Slack 讨论4](https://slack.com/archives/C02CTC89LAX/p1708967073374329)】。 总结: - 可以把 Elementary 的表放在 Snowflake 的另一个数据库,只需在 dbt_project.yml 和 elementary CLI profile 里都指定相同的 database 和 schema。 - 不能把 Elementary 的表放在不同类型的数据仓库(如 Snowflake + Postgres)。 如需具体配置示例,可参考: yaml models: elementary: +database: YOUR_ELEMENTARY_DB +schema: elementary 并在 profiles.yml 的 elementary profile 里也指定 `database: YOUR_ELEMENTARY_DB`。lokin
08/14/2025, 9:50 AMkapa.ai
08/14/2025, 9:50 AMkapa.ai
08/14/2025, 9:51 AMdbt_project.yml 里**不配置** yaml materialized: "{{ 'table' if target.name == 'prod-cloud' else 'view' }}" 也**不配置全局 materialized**,那么 dbt 会采用各个模型自身的默认 materialization。 - dbt 的默认 materialization 是 `view`,除非你在模型文件或更高层级显式指定为 `table`。 所以,如果你什么都不配,**大部分模型会被物化为 view**,而不是 table。 如果你希望全部物化为 table,需要显式配置: yaml models: +materialized: table 但注意:**不要让这个全局配置影响到 elementary 包,否则会导致 elementary 的模型不能正常工作**。正确做法是只对你的项目模型设置 materialized,对 elementary 单独配置 schema,例如: yaml models: my_project: +materialized: table elementary: +schema: "elementary" 【参考:[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】lokin
08/14/2025, 9:54 AMmodels:
elementary_project:
materialized: "{{ 'table' if target.name == 'prod-cloud' else 'view' }}"
elementary:
+database: HOORAY_ELEMENTARY
+schema: "elementary"kapa.ai
08/14/2025, 9:54 AMkapa.ai
08/14/2025, 9:54 AMyaml elementary_project: materialized: "{{ 'table' if target.name == 'prod-cloud' else 'view' }}" 这段配置的意思是:只有在 target.name 为 prod-cloud 时物化为 table,否则为 view。如果你想**全部物化为 table**,可以直接写: yaml elementary_project: +materialized: table 2. elementary 的配置是正确的,单独指定了 database 和 schema: yaml elementary: +database: HOORAY_ELEMENTARY +schema: "elementary" 3. **重要提示**:不要让全局 materialized 配置影响到 elementary 包,否则会导致 elementary 的模型不能正常工作。你现在的写法 elementary 已经是单独配置,不会被 elementary_project 的 materialized 覆盖,这是推荐做法【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】。 --- 总结: - 如果你想 elementary_project 下的所有模型都物化为 table,改成: yaml elementary_project: +materialized: table - elementary 的配置保持不变即可。 这样 elementary_project 下的模型会全部物化为 table,elementary 的模型会单独放在 HOORAY_ELEMENTARY.elementary 下,并且不会被 table 配置影响。lokin
08/14/2025, 9:58 AMelementary_project:
+materialized: tablekapa.ai
08/14/2025, 9:58 AMkapa.ai
08/14/2025, 9:58 AMyaml elementary_project: +materialized: table 的作用是:**将 elementary_project 这个 models 目录下的所有模型,默认物化为 table**。 也就是说,`models/elementary_project/` 目录下的所有 dbt model,如果没有在模型文件里单独指定 materialized 类型,都会被创建为 table。 这个配置只会影响 elementary_project 下的模型,不会影响其他 models 目录(比如 elementary 包)下的模型【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】。 如果你有多个 models 目录,可以分别为每个目录单独设置 materialized 类型。lokin
08/14/2025, 9:59 AMkapa.ai
08/14/2025, 9:59 AMkapa.ai
08/14/2025, 10:00 AMyaml models: my_project: +materialized: table elementary: +schema: "elementary" 这里的 my_project 应该替换为你自己项目的 models 目录名(比如 `models/your_project/`),而不是固定用 `elementary_project`。 elementary 这一节专门用于 Elementary 包的配置,确保 Elementary 的表单独放在指定 schema 或 database 下。 如果你没有 elementary_project 目录,那就不需要写这一节。只需要对你实际存在的 models 目录进行配置即可。 Elementary 官方文档的推荐写法是这样的: yaml models: <你的项目目录>: +materialized: table elementary: +schema: "elementary" 【参考:[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】 总结: - elementary_project 只是示例名,不是必须的目录名。 - 你应该用你自己项目实际的 models 目录名来配置。 - elementary 的配置单独写,确保不被全局 materialized 配置影响。kapa.ai
08/14/2025, 10:02 AMkapa.ai
08/14/2025, 10:02 AMelementary_project 名称是否需要修改,取决于你项目实际的 models 目录结构。 根据 Elementary 官方文档和大量社区案例,`models:` 下的每个一级 key(如 `elementary_project`、`snowflake_dbt`)应该与你 models/ 目录下的实际子目录名称保持一致。例如,如果你的项目目录结构如下: models/ elementary_project/ ... # 这里放的是你自定义的模型 snowflake_dbt/ ... # 这里放的是你的业务模型 那么 elementary_project 这个 key 就是合理的。如果你并没有 models/elementary_project/ 这个目录,那么建议你删除或更改这个 key,避免无效配置。 **官方推荐做法**是: - 只为你实际存在的 models 目录配置 materialized 等参数。 - elementary 的配置单独写,且不要被全局 materialized 配置影响。 例如,如果你只有 models/snowflake_dbt/ 目录,可以这样写: yaml models: snowflake_dbt: +materialized: table # 你的 schema 配置... elementary: +database: HOORAY_ELEMENTARY +schema: "elementary" 如果你没有 models/elementary_project/ 目录,建议删除 elementary_project: 这一节。 这样配置会更清晰、规范,也符合 Elementary 官方文档的建议【[官方文档说明](https://docs.elementary-data.com/oss/quickstart/quickstart-cli-package#step-by-step:install-elementary-dbt-package)】【[Slack 讨论案例](https://slack.com/archives/C02CTC89LAX/p1701110089154839)】。 总结: - elementary_project 不是 Elementary 官方推荐的固定名称,只是示例。 - 你应该用你实际 models 目录下的子目录名来配置。 - 没有对应目录就删掉,避免无效配置。lokin
08/14/2025, 10:06 AMkapa.ai
08/14/2025, 10:06 AMkapa.ai
08/14/2025, 10:07 AMgenerate_schema_name macro 或 dbt 的 schema 配置逻辑导致 Elementary 的模型被物化到了带有前缀的 schema(如 ANALYTICS_elementary),而不是你期望的 elementary。 根据知识源,常见原因有: 1. generate_schema_name macro 被自定义 如果你项目里有自定义的 generate_schema_name macro,并且逻辑是把 schema 配置(如 `+schema: elementary`)拼接到 target.schema 上,就会出现 <target.schema>_elementary 这样的 schema 名。例如: jinja {% macro generate_schema_name(custom_schema_name, node) -%} {%- if custom_schema_name is none -%} {{ target.schema }} {%- else -%} {{ target.schema }}_{{ custom_schema_name | trim }} {%- endif -%} {%- endmacro %} 这样配置时,如果 target.schema 是 ANALYTICS,custom_schema_name 是 elementary,最终 schema 就会变成 ANALYTICS_elementary【[相关案例](https://slack.com/archives/C02CTC89LAX/p1684341029701899)】。 2. elementary 的 schema 配置未生效或被覆盖 如果 dbt_project.yml 里 elementary 的配置层级或缩进不对,也会导致 schema 配置未生效,进而 fallback 到默认逻辑,出现带前缀的 schema【[相关案例](https://slack.com/archives/C02CTC89LAX/p1684341029701899)】。 解决方法: - 检查你的 generate_schema_name macro,确保 elementary 包的模型不会被拼接前缀。可以在 macro 里加判断,排除 elementary 包: jinja {% macro generate_schema_name(custom_schema_name, node) -%} {% if node.package_name == 'elementary' and custom_schema_name %} {{ custom_schema_name | trim }} {% else %} {{ target.schema }}_{{ custom_schema_name | trim }} {% endif %} {%- endmacro %} 这样 elementary 的模型就会直接用 elementary 作为 schema,不会拼接前缀【[官方FAQ](https://docs.elementary-data.com/oss/general/faq)】【[相关案例](https://slack.com/archives/C02CTC89LAX/p1712851926036669)】。 - 确认 dbt_project.yml 里 elementary 的配置缩进和层级正确,确保 elementary 的 schema 配置被正确识别。 如还有疑问,可以贴出你的 generate_schema_name macro 代码和 dbt_project.yml 相关片段,便于进一步定位问题。lokin
08/14/2025, 10:40 AMkapa.ai
08/14/2025, 10:40 AMkapa.ai
08/14/2025, 10:40 AMdbt_source_freshness_results 表中看到所有新鲜度检测的 pass/fail 记录。 如需进一步分析异常,可以基于这些表做自定义报表或告警【[Slack 讨论](https://slack.com/archives/C02CTC89LAX/p1680509220643279)】。 **总结**: Elementary 能收集 dbt 源新鲜度的检测结果(包括异常),并存储到数据库表中,但不会自动收集异常数据的原始行,仅记录新鲜度检测的元信息和结果。