在pentaho数据集成中新插入或更新的行数

时间:2015-10-20 07:18:41

标签: pentaho etl pdi

我是Pentaho数据集成的新手;我需要将一个数据库集成到另一个位置作为ETL Job。我想在ETL作业期间计算插入/更新的数量,并将该计数插入另一个表。任何人都可以帮我吗?

3 个答案:

答案 0 :(得分:4)

我不认为有一个内置功能可以返回PDI中插入/更新步骤的受影响行的数量。

尽管如此,大多数数据库供应商都能够为您提供从给定操作中获取受影响行的数量的能力。

例如,在PostgreSQL中,它看起来像这样:

/* Count affected rows from INSERT */
WITH inserted_rows AS (
    INSERT INTO ...
    VALUES
        ...
    RETURNING 1
)
SELECT count(*) FROM inserted_rows;

/* Count affected rows from UPDATE */
WITH updated_rows AS (
    UPDATE ...
    SET ...
    WHERE ...
    RETURNING 1
)
SELECT count(*) FROM updated_rows;

但是,您的目标是在PDI作业中执行此操作,因此我建议您尝试到达控制SQL脚本的位置。

建议:将源数据保存在目标数据库服务器上的文件中,然后使用它(可能具有批量加载功能)来插入/更新,然后将受影响的行数保存到PDI变量。请注意,您可能需要使用作业范围内的SQL脚本步骤。

编辑:实施是选择设计的问题,因此建议的解决方案是其中之一。在很高的层次上,您可以执行以下操作。

  • 转换I - 从源中提取数据
    • 从源获取数据,无论是数据库还是其他任何内容
    • 以适合目标数据库结构
    • 的方式准备输出
    • 使用文件系统上的文本文件输出步骤保存CSV文件
  • 父母工作
    • 如果PDI服务器与目标数据库服务器相同:
      • 使用“执行SQL脚本”步骤:
        • 从文件中读取数据并执行INSERT / UPDATE
        • 将受影响的行数写入表中(理想情况下,此表还可以包含操作的时间戳,以便您可以跟踪事物)
    • 如果PDI服务器与目标数据库服务器不同:
      • 将源数据文件上传到服务器,例如使用FTP / SFTP文件上传步骤
      • 使用“执行SQL脚本”步骤:
        • 从文件中读取数据并执行INSERT / UPDATE
        • 将受影响的行数写入表格

编辑2:另一个建议的解决方案

根据@ user3123116的建议,您可以使用比较字段步骤(如果不是您环境的一部分,请查看市场内容)。

我看到的唯一缺点是你必须在插入/更新之前查询目标数据库,这当然是性能较差的。

最终它看起来像是这样(请注意,这只是比较和计算部分): field compare

另请注意,您可以拆分源数据流的输入(COPY,而不是DISTRIBUTE),并进行插入/更新,但此流必须等待才能将字段比较的流转换为结束目标数据库上的查询,否则您可能会得到错误的统计信息。

答案 1 :(得分:3)

"比较字段"步骤将采用2个流作为输入进行比较,其输出为4个不同的流,用于"相同",更改","添加"和"删除"记录。您可以计算这4个,然后处理"更改","添加"和"删除"带有插入/更新的记录。

答案 2 :(得分:2)

您可以从转换设置中的“记录”选项执行此操作。请按照以下步骤操作:

  1. 点击修改菜单 - >的设置
  2. 切换到记录标签
  3. 从左侧菜单中选择步骤
  4. 提供日志连接& 日志表名称 Say StepLog
  5. 选择记录所需的字段( LINES_OUTPUT - 插入计数& LINES_UPDATED - 更新计数)
  6. 点击 SQL 按钮,然后点击执行按钮
  7. 创建表格
  8. 现在所有步骤都将记录到日志表( StepLog )中,您可以将其用于进一步的操作。
  9. 享受