使用 Pentaho DI 增量 upload/update 到 PostgreSQL table
Incremental upload/update to PostgreSQL table using Pentaho DI
我在 Pentaho 数据集成中有以下流程来读取 txt 文件并将其映射到 PostgreSQL table。
我第一次 运行 这个流程一切正常并且 table 得到填充。但是,如果稍后我想对同一个 table 进行增量更新,我需要 t运行 对其进行分类并再次 运行 流。有什么方法可以让我只加载 new/updated 行吗?
在 PostgreSQL Bulk Load 运算符中,我只能看到 "Truncate/Insert" 个选项,这是非常低效的,因为我的 table 非常大。
查看我的实现:
提前致谢!!
四处寻找可能性,一些用户说批量加载器的唯一优势是处理大量行(数百万以上)时的性能。但是有一些方法可以解决这个问题。
尝试使用Table输出步骤,批量大小(步骤中的"Commit size")为5000,并改变执行副本的数量步骤(取决于您的处理器具有的内核数量)说,4 个副本(双核 CPU 有 2 个逻辑内核 ea.)。您可以通过右键单击 GUI 中的步骤并设置所需的数量来更改副本数量。
这会将输出并行化为 4 组插入,每组 'cycle' 5000 行。如果这导致 JVM 中的内存过载,您可以轻松调整并增加选项 PENTAHO_DI_JAVA_OPTIONS 中的内存使用量,只需将 Xms(最小值)和 XmX(最大值)上设置的数量加倍即可,我的设置为“ -Xms2048m" "-Xmx4096m".
我发现此步骤和 PostgreSQL 的唯一特点是您需要在该步骤中指定数据库字段,即使传入行的布局与 table 完全相同。
您正在寻找增量加载。你可以通过两种方式做到这一点。
- 有一个名为 "Insert/Update" 的步骤,这将用于执行增量加载。
您可以选择指定要比较的键列。然后在字段部分 select "Y" 下进行更新。请 select "N" 对于您正在 select 进行键比较的那些列。
- 使用table 输出并取消选中"Truncate table" 选项。从源 table 检索数据时,在 where 子句中使用变量。首先从目标 table 中获取最大值并将此值设置为变量并包含在查询的 where 子句中。
正在此处编辑..
如果您的数据源是平面文件,那么正如我所说,从目标 table 获取最大值 (date/int) 并加入您的数据。之后使用过滤器行来获得增量数据。
希望这会有所帮助。
我在 Pentaho 数据集成中有以下流程来读取 txt 文件并将其映射到 PostgreSQL table。
我第一次 运行 这个流程一切正常并且 table 得到填充。但是,如果稍后我想对同一个 table 进行增量更新,我需要 t运行 对其进行分类并再次 运行 流。有什么方法可以让我只加载 new/updated 行吗?
在 PostgreSQL Bulk Load 运算符中,我只能看到 "Truncate/Insert" 个选项,这是非常低效的,因为我的 table 非常大。
查看我的实现:
提前致谢!!
四处寻找可能性,一些用户说批量加载器的唯一优势是处理大量行(数百万以上)时的性能。但是有一些方法可以解决这个问题。
尝试使用Table输出步骤,批量大小(步骤中的"Commit size")为5000,并改变执行副本的数量步骤(取决于您的处理器具有的内核数量)说,4 个副本(双核 CPU 有 2 个逻辑内核 ea.)。您可以通过右键单击 GUI 中的步骤并设置所需的数量来更改副本数量。
这会将输出并行化为 4 组插入,每组 'cycle' 5000 行。如果这导致 JVM 中的内存过载,您可以轻松调整并增加选项 PENTAHO_DI_JAVA_OPTIONS 中的内存使用量,只需将 Xms(最小值)和 XmX(最大值)上设置的数量加倍即可,我的设置为“ -Xms2048m" "-Xmx4096m".
我发现此步骤和 PostgreSQL 的唯一特点是您需要在该步骤中指定数据库字段,即使传入行的布局与 table 完全相同。
您正在寻找增量加载。你可以通过两种方式做到这一点。
- 有一个名为 "Insert/Update" 的步骤,这将用于执行增量加载。
您可以选择指定要比较的键列。然后在字段部分 select "Y" 下进行更新。请 select "N" 对于您正在 select 进行键比较的那些列。
- 使用table 输出并取消选中"Truncate table" 选项。从源 table 检索数据时,在 where 子句中使用变量。首先从目标 table 中获取最大值并将此值设置为变量并包含在查询的 where 子句中。
正在此处编辑.. 如果您的数据源是平面文件,那么正如我所说,从目标 table 获取最大值 (date/int) 并加入您的数据。之后使用过滤器行来获得增量数据。
希望这会有所帮助。