etl - 从转换中提取行为
问题描述
在实际 ETL 处理之前和之后,我有几个转换都执行类似的功能:
- 查看某些目录以查看是否出现了新的集成文件(数据库中维护的目录)
- 在数据库中将找到的文件标记为“正在使用”(并存储一些其他文件属性)
- 将文件移动到“正在使用”的子目录
- 运行 ETL 过程
- 将文件标记为“已完成”
- 将文件移动到“完成”子目录
这些步骤是业务需求,并且对于基于文件输入的每个 ETL 过程都是 100% 相同的(除了用于搜索的目录列表和已注册文件的不同数据库表)。维护这个几乎相同过程的 X 个副本(如果必须更改,则更新所有副本似乎不理想)
因此,我创建了一个“骨架”转换来完成所有这些工作,并通过将变量传递到转换位置来“注入”“运行 ETL 过程”部分。这样,“注入”转换不需要知道文件处理步骤,并且文件处理步骤与实际的 ETL 过程分离。
由于我对 PDI 相当缺乏经验,我想知道这些问题通常是如何解决的,以及我的方法是否有用。
解决方案
您的方法符合最佳实践。将已处理的文件移动到存档目录中是可行的方法,并且将状态“使用中”/“已完成”保持在可从外部访问的数据库中非常方便。
传统上,您会在转换参数中而不是在数据库中定义文件名和其他属性。但是,将它们存储在数据库中可以让您从外部访问它,甚至可以制作一个小型 Web 应用程序来显示状态。
您还可以在单独的转换中提取预处理和后处理 ETL,并在一个作业中编排整个过程。
我想您没有忘记在其他几个属性中包含文件大小(行数)。并且您有一个命名约定来帮助您在失败的情况下重新运行该过程而不会头疼。
最后,我建议您还跟踪数据库中的日志。只需单击任意位置,选择Properties
/ Parameters
/ Transformation
,定义一个database connection
+ table
,一个logging interval
2 (秒),然后按下SQL
按钮。您在底部表格中看到的所有内容Step metrics
(输入、输出...)都将保存在数据库中。当您发现上周出现问题时很有用。
推荐阅读
- oracle - 检查不在两个日期之间sql
- javascript - 无法从 nodejs 中的 API URL 获取图像文件
- xamarin.forms - Xamarin.Forms 跨平台架构
- build - QGIS 3.x debian armhf 安装 (RPi 4)
- mongodb - 将 OSX 更新到 Catalina 后,MongoDB 无法工作
- c++ - 作为变量的文字 0 和 0 如何使用函数 __builtin_clz 产生不同的行为?
- javascript - 错误:addEventListener 不是函数,当我使用 getElementByClassName 时
- django - Django:如何将forms.py中的表单选项标记为选中
- javascript - 如何使一个 div 扩展全宽,同时隐藏另一个 div
- c# - 2D ArrayList 二分搜索 c#