kettle 入门(一)输入输出写日志 / 插入更新

本文详细介绍如何使用Kettle进行数据转换,包括设置数据库连接、编写SQL脚本、使用表输入和输出插件,以及错误步骤处理。同时,介绍了字段选择插件的功能,如字段重命名、类型转换和编码设置,确保数据准确无误地从一个数据库迁移到另一个。

新建转换(不是新建作业)

然后我们先在主对象树里面设置好db连接

测试一下 就可以继续了。

里面有各种数据库的连接类型 根据自己的需求  选择数据库连接

配置好之后 我们就开始写kettle脚本

(在里面写具体的sql脚本就可以)

现在核心对象里面找到表输入 拉入到我们新建的转换里

然后是表输出

然后将我们这个两个插件连接到一起

在核心对象找出 文本文件输出

将他们连接在一起 

连接选择的时候 选择错误步骤处理  ,然后点击红色xx 会有个弹窗

可以选择一个错误输出,也可以在错误输出里面选择字段,和文件的具体存放路径和格式。

又或者 我们把这个步骤替换成写日志这个插件

道理是一样的 但是这个写日志插件会把错误输出 或者输出 在控制台显示,如果

数据量太大的话会把kettle卡死,如果在表输入限制条数的话 可以,还是建议是使用

文本文件输出,更加的具体,和保存性,更加我们对于这个错误进行处理

 

还可以在表输入和输出之间加一个字段选择插件

这个主要是做什么的呢?我是这么理解的

就像他直观所见我们可以在选择和修改里面把表输入的字段

重新命名,定义他的长度和精度

元数据里面就是经常使用的了,我们可以把表输入里面的

字段通过这个插件进行类型转换,比如varchar(100)转换成

date类型(number,string..等等..)而且可以选择具体的显示格式

和编码类型 防止乱码出现 。

这个脚本主要是做什么的呢!用来把一个表拉取到另一个库,或者不同数据库的表中

这样比较方便,而且效率很高 ,又不怕不同数据库类型不同而困惑。

今天先教大家这个一个方案,其实还有很多种做法,我们日后一 一讲解

希望大家多多关注 互相学习,我们共同成长,以后争取每日一更 共同加油努力

<think>我们正在讨论Kettle(也称为Pentaho Data Integration)中的“插入/更新”步骤。该步骤用于将数据插入到目标表中,如果目标表中已存在基于匹配键的记录,则更新该记录。 根据Kettle的文档和实际行为,以下情况会导致“插入/更新”步骤不执行插入更新操作: 1. **没有输入行**:如果前步骤没有向“插入/更新”步骤传递任何行,那么显然不会执行任何插入更新操作。 2. **所有行都被忽略**:在“插入/更新”步骤中,可以设置个“提交记录数量”的选项。但是,即使有输入行,如果这些行在提交之前被某种条件过滤掉(例如,通过错误处理设置将行发送到错误流),那么这些行也不会被插入更新。 3. **连接失败**:如果与目标数据库的连接失败,则无法执行插入更新操作。 4. **事务设置**:如果数据库连接设置为手动提交,并且在执行插入/更新步骤后没有提交事务,那么这些操作可能不会真正入数据库(直到提交事务)。此外,如果在事务过程中发生错误并回滚,那么这些操作也不会生效。 5. **条件不满足**:在配置“插入/更新”步骤时,需要设置用于比较的键字段。如果输入行中的键字段值与目标表中的任何行都不匹配,则执行插入操作;如果匹配,则执行更新操作。但是,如果更新操作中设置的所有字段值与目标表中对应行的值完全相同,那么某些数据库可能不会实际执行更新(因为值没有变化)。不过,Kettle的“插入/更新”步骤默认会执行更新,即使值没有变化。但是,可以通过个选项来控制是否更新相同的值:在“插入/更新”步骤的高级选项中,有个“不更新相同的值?”(Do not update identical values?)的复选框。如果勾选了这个复选框,那么当要更新的字段值与目标表中的字段值完全相同时,将不会执行更新操作。因此,在这种情况下,不会更新记录,但也不会插入新记录(因为匹配到了记录,所以不会插入,而更新又被跳过)。 6. **错误处理**:如果在步骤中配置了错误处理,并且某些行触发了错误(例如,违反唯性约束、数据类型不匹配等),那么这些行会被发送到错误流,而不会执行插入更新。 7. **目标表不存在或没有权限**:如果目标表不存在,或者执行用户没有足够的权限,那么操作也会失败。 8. **主键冲突(仅插入时)**:在插入新记录时,如果目标表的主键或唯索引与要插入的记录冲突,则会失败(除非步骤配置了错误处理,将错误行发送到错误流)。 9. **更新操作中的唯键冲突**:在更新操作中,如果更新操作导致目标记录的唯键与表中其他记录冲突,也会导致失败。 10. **批量更新设置**:如果设置了批量更新,并且批量大小不为1,那么直到批量提交之前,数据可能不会入数据库。如果某个批次中有错误,整个批次可能都会回滚。 11. **步骤被禁用**:在转换中,如果该步骤被禁用,则不会执行。 12. **转换被中断**:如果在执行过程中转换被中断(例如,用户停止转换),则未提交的操作将不会执行。 因此,在排查“插入/更新”步骤未执行操作时,需要检查以上情况。 下面我们生成相关问题:</think>### Kettle 插入/更新输出步骤不执行操作的情况分析 在 Kettle(Pentaho Data Integration)中,**插入/更新输出步骤**用于将数据同步到目标数据库:若目标表不存在匹配记录则插入新行;若存在则更新现有行。以下情况会导致该步骤不执行插入更新操作: #### 1. **无匹配的键字段** - 当输入流的**所有字段值**与目标表的键字段(如主键)均不匹配时,步骤默认不会执行任何操作[^1]。 - **解决方案**:检查键字段配置是否准确,或启用 "Don't perform any update" 选项强制插入新记录。 #### 2. **更新值与原值完全相同** - 若输入流中待更新的字段值 **与目标表现有记录完全致**,数据库可能跳过更新(取决于配置)。 - **示例**:目标表字段 `price=100`,输入流中 `price=100` → 无操作。 - **解决方案**:勾选步骤的 "Update even if the values are identical" 选项强制更新[^2]。 #### 3. **条件过滤导致零行处理** - 前置步骤(如过滤、JavaScript)可能过滤所有输入行,导致无数据传递到插入/更新步骤。 - **验证方法**:在插入/更新步骤前添加 "Write to Log" 步骤检查数据流。 #### 4. **数据库连接或权限问题** - 数据库连接失败、事务隔离级别冲突(如 `REPEATABLE_READ`)或用户缺乏权限时,操作会静默失败。 - **诊断**:检查 Kettle 日志中的 `ERROR` 条目或启用数据库的查询日志。 #### 5. **批量提交模式下的错误处理** - 若启用批量提交(如 `Batch size=1000`),且某行因约束冲突(如唯键重复)失败,**整个批次会被回滚**。 - **解决方案**: - 减小批处理大小。 - 使用 "Error handling" 选项卡将错误行重定向到其他步骤[^3]。 #### 6. **目标表触发器干扰** - 目标表的 `BEFORE UPDATE` 触发器可能修改数据或阻止操作。 - **验证**:临时禁用触发器测试是否恢复正常。 --- ### 配置建议 1. **强制插入不匹配记录**: ```mermaid graph LR A[输入流] --> B{插入/更新步骤} B -->|勾选 Don't perform any update| C[新记录全部插入] ``` 2. **调试流程**: - 添加 "Table Output" 步骤将输入流入临时表,对比目标表差异。 - 使用 `SELECT * FROM target_table WHERE key_field IN (...)` 手动验证匹配逻辑。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值