使用Pentaho Spoon实现多值字段拆分与带权重的行插入需求
我来帮你一步步搞定这个Pentaho Spoon的数据处理任务,咱们分两个部分实现你要的两个结果表:
这部分核心是拆分PERSON字段,再计算每个ID对应的权重:
第一步:读取源数据
用Table Input组件连接你的源数据库,写SQL语句拉取所有源表数据;如果源数据是文件的话,就用Text File Input组件读取,注意配置好字段分隔符。第二步:拆分PERSON为多行
添加Split Fields to Rows组件,把它和前面的数据源连起来。在组件配置里:- 选择要拆分的字段:
PERSON - 分隔符填
,
运行这一步后,原来的A,B就会拆成两行,每行保留对应的ID、TYPE、MATERIAL字段。
- 选择要拆分的字段:
第三步:统计每个ID的行数
加一个Group By组件,分组字段选ID,然后添加一个聚合函数Count,给结果字段起名ROW_COUNT(这个值就是每个ID拆分后的总行数,比如ID=1拆分后是2行,ROW_COUNT就是2)。第四步:关联权重并计算PONDERACION
用Merge Join组件,把拆分后的数据流(左边)和Group By得到的统计数据流(右边)关联起来,关联条件设为ID = ID。
接着加Calculator组件,计算表达式写1 / ROW_COUNT,把结果字段命名为PONDERACION。如果需要像示例里那样用逗号做小数分隔符,后续可以加Format Number组件,设置格式为0,0或者0,00来调整显示格式。第五步:输出结果
用Table Output组件,只选择ID、PERSON、PONDERACION这三个字段,写入你的目标表就搞定了。
思路和第一个表几乎一致,只是拆分的字段换成TYPE:
第一步:分支源数据流(或重新读取)
如果你不想重复读取源数据,可以在最开始的数据源之后,用一个Hop分支出一条新的数据流;当然重新用Table Input读取也没问题。第二步:拆分TYPE为多行
同样用Split Fields to Rows组件,这次选择拆分TYPE字段,分隔符还是,。比如ID=2的2444,1555会拆成两行,每行对应同一个ID。第三步:统计每个ID的行数
加Group By组件,按ID分组,统计行数得到ROW_COUNT(比如ID=2拆分后是2行,ROW_COUNT=2)。第四步:计算权重
用Merge Join关联拆分后的数据流和统计数据流,再用Calculator计算1 / ROW_COUNT得到PONDERACION,同样可以用Format Number调整小数分隔符。第五步:输出结果
用Table Output组件,选择ID、TYPE、PONDERACION字段写入目标表。
- 确保
Group By组件的分组字段只有ID,这样统计的才是每个ID拆分后的总行数,权重计算才准确。 - 如果你的Spoon默认小数分隔符是点,而示例需要逗号,记得用
Format Number组件转换,避免格式不符。 - 可以给每个组件加注释,方便后续维护哦!
内容的提问来源于stack exchange,提问作者Anna_DL

