介绍
在当今数据驱动的世界中,dbt(数据构建工具)已成为将原始数据转化为可操作见解的开源转换工具。在这篇文章中,我们将使用我自己的经验中的一个真实例子,探讨dbt的有组织的层方法(阶段表、中间表和集市/最终表),以及自动化如何使新资源的加入更加高效。
DBT:数据转换完成正确
DBT允许数据工程师和分析师使用简单、可维护和版本控制的代码库来执行复杂的数据操作。通过将数据转换视为代码,dbt使团队能够构建模块化、可重用和可测试的数据管道。
分层方法:阶段表、中间表和Marts/Final表
将数据转换组织到层中可以创建一个清晰且可维护的管道:
- 暂存层:第一层从各种来源获取原始数据,并对其进行轻微转换,为进一步的转换创建一致的模式。
- 中间层:在这里,来自暂存层的数据被进一步转换为结构化格式,涉及复杂的计算、聚合和业务逻辑。
- Marts/Final Tables层:最后一层由定义明确、精心策划的表组成,这些表针对最终用户的消费进行了优化,回答了用于报告和分析的特定业务问题。
使用DBT Codegen实现自动暂存:一个真实的例子
在我的公司加入DBT时,我最初手动加入了五张表。意识到我还有30张表要放在我正在做的特定项目上,我知道必须有一种更有效的方法。就在那时,我发现了使用dbt代码生成的自动化(https://github.com/dbt-labs/dbt-codegen)并发现它大大简化了流程。
dbt-codegen提供了自动创建暂存层的宏,例如generate_source宏,它为源文件生成YAML代码。
这是gitlab repo的官方文档
dbt codegen提供的另一个有用的宏是generate_base_model。这个宏基于源表为基础模型(名为stg_tablename)生成SQL代码,这里也是gitlab repo的官方文档。
使用Generate_Base_Model和Generate_Source宏高效地装载多个源
在使用generate_base_model和generate_source宏加入30个源代码后,我决定加入更多的源代码。对于我的下一个项目,我需要加入大约60个来源。
虽然复制粘贴60次是可行的,但我知道必须有一种更有效的方法。通过使用两个现成的CLI工具sed和>operator,我能够节省时间并减少手动工作。
sed是一个功能强大的流编辑器,用于过滤和转换文本,而>运算符用于输出重定向,允许您将命令的输出保存到文件中。通过组合这两个工具,我能够运行generate_source命令,如下所示:
dbt run-operation generate_source \ --args '{"schema_name": "schema_name", "database_name": "db_name"}' \ | sed '1d;2s/^.\{14\}//' \ > models/myfolder/sources.yml
sed命令在这里使用1d来删除输出的第一行,并使用2s/^\{14\}//删除第二行开头的前14个字符。这有效地消除了第一行和第二行中特定数量的字符。请记住,您可能需要根据环境调整要删除的空间或线的数量。
输出重定向操作符(>)允许您创建一个文件,并将终端的输出直接保存到其中。使用这两个工具,我甚至不再需要复制粘贴源文件。
这是我使用的generate_base_model命令。
dbt run-operation generate_base_model \ --args '{"source_name": "your_source_name", "table_name": "table_name"}' \ | sed '1,2d' \ > models/myfolder/stg_tablename.sql
我只需要删除每个表的基本模型的前2行,而我可以手动使用相同的技术60次。我想我可以构建一个快速循环脚本,省去每次更改表名和文件名的手动工作。以下是我最终编写的脚本模板:
for x in $(sed -n '5,$s/- name://p' models/myfolder/sources.yml) do dbt run-operation generate_base_model --args '{"source_name": "source_name", "table_name": '$x'}' \ | sed 1,2d > models/myfolder/stg_$x.sql
以下是脚本每一部分的功能分解:
- 对于$中的x(sed-n'5,$s/-name://p'models/myfolder/sources.yml);do\:这一行迭代sed命令的输出。sed命令从sources.yml文件中提取表名。它从第五行(5,)开始,一直到文件的末尾($)。它查找以-name:开头的行,并删除-name:前缀,只打印表名。for循环将每个表名分配给变量x,并为每个表名重复该循环。
- dbt run operation generate_base_model\:此行运行generate_bbase_model宏,该宏为指定的源和表名称生成基本模型SQL代码。
- --args'{“source_name”:“your_source_name”,“table_name”:”'$x'“}'\:此行将源名称和表名称作为参数传递给generate_base_model宏。表名被设置为循环中的变量x。
- |sed 1,2d>模型/myfolder/stg_$x.sql;\:这一行将generate_base_model宏的输出通过管道传输到另一个sed命令,该命令将删除输出的前两行(1,2d)。然后,剩余的输出被重定向到一个名为stg_$x.sql的新文件,其中$x是表名。这将为sources.yml中的每个表创建一个新的暂存模型文件。
我希望这篇文章对您学习如何使用dbt和一些CLI工具简化新数据源的入职流程有所帮助。
最新内容
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week ago
- 1 week 6 days ago
- 2 weeks ago
- 2 weeks 2 days ago
- 2 weeks 2 days ago
- 2 weeks 2 days ago