kettle 合并记录 数据减少

本文针对数据合并过程中出现的记录数量不匹配问题进行了探讨,通过排序、字段调整等手段解决了数据丢失的问题。

今天进行数据合并操作遇到这样一个问题:合并记录为207条、输出为206条

参考了其他人的文章 提供的结局思路

1.在操作db时,控制顺序,先delete,后insert,这样数据不会少
2.我猜测,一个修改的数据可能在判断是新增、修改、删除时,在旧数据源没有最快找到记录,就标记成new,后面在旧数据源找到一条数据,在新数据源中(已经过去的数据不考虑)没有找到,就标记成deleted
所以解决方法很简单,将新旧数据源都排序,这样得到了我想要的结果。

我做了四种尝试

1、更改新旧数据源 

将新、旧数据源更改即可,并未解决。

2、改变合并记录的字段设置(结合第一种成功)
   新增其他过滤条件,结合第一种成功。

3、排序后合并记录

  根据当中的字段sClassCode排序后,反而又少了3条。失败~

4、增加常数序列

  增加常数序列后,无任何改变。

 

上述四种方法,单一很难有用,

结合两种或者多种就能够保持数据量不变。

具体原理我也不是很懂,求指教~~~(c243126035)

### Kettle中排序合并组件的使用方法 #### 1. 排序合并的概念 排序合并(Merge Sort)是一种高效的算法,通常用于处理大规模数据集。在Kettle中,排序合并通过`记录集连接`或`合并记录`步骤实现[^2]。这些步骤允许用户将来自多个源的数据流基于特定条件进行组合。 --- #### 2. 组件的工作原理 在Kettle中,排序合并的核心在于确保输入数据已按关联字段排序。如果未预先排序,可能会导致错误的结果或警告消息。以下是具体工作流程: - **预排序需求** 在执行`记录集连接`或`合并记录`前,必须确认两组数据均已按关联字段排序[^4]。如果不满足这一前提,可能需要额外添加`排序记录`步骤来完成排序操作。 - **连接类型支持** `记录集连接`支持多种连接方式,包括左连接、右连接、内连接和全外连接。这使得它可以灵活应对不同的业务场景[^2]。 - **性能优化建议** 如果数据量较大,推荐提前在数据库端完成排序再导入至Kettle,这样可以显著减少内存消耗并提升效率[^4]。 --- #### 3. 配置步骤详解 ##### (1)创建转换图 设计一个包含至少两个数据源的转换图,并分别加载所需数据流。例如,可以从两张表`t_test_a`和`t_test_b`读取数据[^5]。 ##### (2)添加排序记录步骤 当原始数据未排序时,需插入`排序记录`步骤以准备后续操作。配置如下: - 指定要排序的字段名称; - 定义升序/降序规则。 示例代码片段展示如何定义SQL查询作为初始数据源: ```sql -- 数据源A with t_test_a as ( select 1 sno, 'a' name from dual union all select 2 sno, 'b' name from dual union all select 3 sno, 'c' name from dual ) select * from t_test_a; -- 数据源B with t_test_b as ( SELECT 1 sno, '男' sex FROM dual UNION ALL SELECT 2 sno, '女' sex FROM dual ) select * from t_test_b; ``` ##### (3)应用记录集连接 选择合适的连接模式(如LEFT JOIN),并将两个经过排序的数据流引入`记录集连接`步骤。注意正确映射双方的关键字段[^4]。 ##### (4)验证输出结果 最后一步是检查生成的目标文件或目标表是否符合预期逻辑。可以通过Excel导出或其他可视化工具辅助分析。 --- #### 4. 常见问题及其解决办法 | **问题描述** | **原因分析** | **解决方案** | |--------------|--------------|--------------| | 连接后的某些行缺失 | 输入数据未按关键字段排序 | 添加`排序记录`步骤重新整理次序[^4] | | 出现大量NULL值 | 关联字段不一致或者存在重复项 | 校验字段定义;清理脏数据后再尝试 | | 性能瓶颈明显 | 处理超大数据集时占用过多资源 | 将部分计算移交给底层DBMS完成 | --- ### 示例代码演示 以下是一个完整的Kettle脚本模板,展示了从数据提取到最终合并的过程: ```python # 步骤1: 加载数据源A query_A = """ WITH t_test_a AS ( SELECT 1 sno, 'a' name FROM DUAL UNION ALL SELECT 2 sno, 'b' name FROM DUAL UNION ALL SELECT 3 sno, 'c' name FROM DUAL ) SELECT * FROM t_test_a; """ # 步骤2: 加载数据源B query_B = """ WITH t_test_b AS ( SELECT 1 sno, '男' sex FROM DUAL UNION ALL SELECT 2 sno, '女' sex FROM DUAL ) SELECT * FROM t_test_b; """ # 步骤3: 对齐字段顺序并通过JOIN结合两者 merged_data = pd.merge( sql_to_dataframe(query_A), sql_to_dataframe(query_B), on='sno', how='inner' ) print(merged_data.head()) ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值