欢迎来数据分析工程系列教程,本文我们学习使用dbt的实用程序包生成代理键。DBT是转换数据仓库中的数据的强大工具,同时还包括丰富的生态工具包,其中一个常用的工具是生成代理键,这对于数据建模和分析至关重要。
DBT Utils 实践应用指南 从总体上介绍了几类功能,本文重点介绍generate_surrogate_key宏如何生成代理键,并基于示例展示最佳实践指南。
主键和代理键
- 主键
主键是表中行记录的标识符。主键能确保行不重复,唯一确定一行记录,同时能与其他表建立关系。
- 代理键
当数据记录没有唯一的主键时,代理键就可以解决问题了。通常在分析层由主键派生产生的,确保每个记录都有唯一的标识符。
dbt_utils包提供了一组宏函数来简化常用任务。其中generate_surrogate_key宏用于创建代理键。
生成代理键
- 何时使用: 当表缺少唯一主键时,或合并来自多个数据源的数据时,需要代理键唯一标识记录。
- 如何使用: generate_surrogate_key宏使用多个字段连接、基于hash算法(默认为MD5)生成唯一代理键。
{{ dbt_utils.generate_surrogate_key('field_a', 'field_b') }}
- 处理空值
如果任何值为空,则整个连接的字符串可能返回为空。
解决方法: 使用coalesce函数替换空值。该函数用默认值替换空值,从而确保连接字符串保持唯一。
分隔符重要性: 为了确保唯一性,可以在字段之间添加分隔符,特别是在处理空值时能避免空值错误。
select
{{ dbt_utils.generate_surrogate_key(
coalesce(activity_date,'NO_ACTIVITY'),
'---',
user_id)
}} as primary_key,
activity_date,
user_id,
total_actions
from {{ ref('int__user_daily_activity') }}
- 自定义哈希函数
虽然MD5是默认的散列函数,但也可以使用SHA,因为它具有加密优势。
如何切换: 在项目的macros目录下添加hash.sql
宏覆盖dbt中的默认哈希宏。该文件应包括以下内容:
{% macro default__hash(field) -%}
sha(cast({{ field }} as {{ api.Column.translate_type('string') }}))
{%- endmacro %}
最佳实践
- 一致性: 确保在整个项目中使用相同的方法生成代理键。
- 数据完整性: 定期在dbt中测试代理键,以确保数据的完整性和唯一性。
- 避免陷阱: 小心空值,并确保使用分隔符来保持唯一性。
最后总结
代理键在数据建模中是非常有价值的,特别是在处理来自不同来源的数据时。使用dbt_utils包的generate_surrogate_key宏,让生成代理键变得简单、流程,让你能专注于分析,而不是准备数据。期待您的真诚反馈,更多内容请阅读数据分析工程专栏。