在数据清洗转换中,常见的字典翻译,如性别在原表中是1(男)、2(女)等,类似还有很多较大的字典需要翻译,若同一个表中有很多个字典需要翻译,采用【数据库查询】方式翻译的话效率就会相当低下。

  这里采用java代码来翻译,初始化时将相关字典加载到内存中,此后就不需要再查询数据库了,然后每条记录进来就翻译各个字典,其实很简单,只是【java代码】这个控件限制较多,不支持泛型、this并不是步骤本身、能使用的方法都列在了左侧,使用起来不是很方便。关于字典翻译这个事,其实写一个专门的控件也不难,也是很不错的一个主意,只是没有真正完整的写个一个控件(后台实现和ui部分等),要写的话比较耗时,暂时就采用java代码实现,有时间可以考虑写这么个控件。

  算了废话太多,测试转换如下图

  自定义常量就是模拟了几条数据,你可以直接传递要翻译的数据,写日志就是看看翻译结果,【java代码】中的代码如下:

import java.util.Arrays;
import java.util.List;
import java.util.HashMap;
import java.util.Map;
import org.pentaho.di.core.database.Database;
import org.pentaho.di.core.database.DatabaseMeta;
import org.pentaho.di.repository.Repository;
import org.pentaho.di.core.Const;public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException
{if (first){first = false;/* TODO: Your code here. (Using info fields)FieldHelper infoField = get(Fields.Info, "info_field_name");RowSet infoStream = findInfoRowSet("info_stream_tag");Object[] infoRow = null;int infoRowCount = 0;// Read all rows from info step before calling getRow() method, which returns first row from any// input rowset. As rowMeta for info and input steps varies getRow() can lead to errors.while((infoRow = getRowFrom(infoStream)) != null){// do something with info datainfoRowCount++;}*/}Object[] r = getRow();if (r == null) {setOutputDone();return false;}//获取要翻译字典的代码String kkdm = get(Fields.In, "kkdm").getString(r);String cllx = get(Fields.In, "cllx").getString(r);// It is always safest to call createOutputRow() to ensure that your output row's Object[] is large// enough to handle any new fields you are creating in this step.r = createOutputRow(r, data.outputRowMeta.size());//翻译字典并设置到输出字段中get(Fields.Out, "kkmc").setValue(r, kkzdMap.get(kkdm));get(Fields.Out, "cxmc").setValue(r, cxzdMap.get(cllx));/* TODO: Your code here. (See Sample)// Get the value from an input fieldString foobar = get(Fields.In, "a_fieldname").getString(r);foobar += "bar";// Set a value in a new output fieldget(Fields.Out, "output_fieldname").setValue(r, foobar);*/// Send the row on to the next step.
    putRow(data.outputRowMeta, r);return true;
}//定义字典缓存Map
public static Map cxzdMap = new HashMap();
public static Map kkzdMap = new HashMap();
public boolean init(StepMetaInterface stepMetaInterface, StepDataInterface stepDataInterface)
{try {//连接数据库,pg_test是数据库名称,在左侧db连接处创建DatabaseMeta dbmeta = DatabaseMeta.findDatabase(this.getTrans().getRepository().readDatabases(), "pg_test");Database zddb = new Database(this.getTrans(),dbmeta);logBasic(zddb.getObjectName());zddb.shareVariablesWith( this.getTrans() );zddb.setQueryLimit( Const.toInt( this.getTrans().environmentSubstitute( "100" ), 0 ) );try {if ( getTransMeta().isUsingUniqueConnections() ) {synchronized ( getTrans() ) { zddb.connect( getTrans().getTransactionId(), "zdfy" );logBasic(zddb.getObjectId().toString());}} else {zddb.connect( getTrans().getTransactionId(), null );}}catch ( KettleException e ) {logError( "An error occurred, processing will be stopped: " + e.getMessage() );setErrors( 1 );stopAll();}if ( dbmeta.isRequiringTransactionsOnQueries() ) {zddb.setCommit( 100 ); }logBasic(Arrays.asList(zddb.getTablenames()).toString());//查询字典表,获取字典数据本缓存到对应Map中List list = zddb.getRows("SELECT * from t_cxzd", 1000);for(int i=0;i<list.size();i++){Object[] objs = (Object[]) list.get(i);cxzdMap.put(objs[0].toString(), objs[1].toString());}logBasic(cxzdMap.entrySet().toString());list = zddb.getRows("SELECT * from t_kkzd", 1000);for(int i=0;i<list.size();i++){Object[] objs = (Object[]) list.get(i);kkzdMap.put(objs[0].toString(), objs[1].toString());}logBasic(kkzdMap.entrySet().toString());zddb.disconnect();} catch (KettleException e1) {logError("获取数据库失败", e1);}return parent.initImpl(stepMetaInterface, stepDataInterface);}

转载于:https://www.cnblogs.com/majinju/p/5002626.html

kettle系列-6.kettle实现多字段字典快速翻译相关推荐

  1. 开源ETL工具kettle系列

    开源ETL工具kettle系列之常见问题 摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案 1. J ...

  2. 开源ETL工具kettle系列之常见问题

    摘要:本文主要介绍使用kettle设计一些ETL任务时一些常见问题,这些问题大部分都不在官方FAQ上,你可以在kettle的论坛上找到一些问题的答案 1. Join 我得到A 数据流(不管是基于文件或 ...

  3. php调用kettle,kettle系列教程二

    kettle系列教程二 1.Hello World 示例 通过这个例子,介绍kettle的一些基础知识及应用: n 使用Spoon工具 n 转换的创建 n 步骤及连线 n 预定义变量 n 在Spoon ...

  4. kettle 筛选数据 并根据关键字段去重 设计

    文章目录 前言 kettle 筛选数据 并根据关键字段去重 设计 实现: 1.配置sqlite 数据库链接 2.先从test表里抽取数据 3.将表输入查询的数据插入到excel里 4.将筛选出来的数据 ...

  5. KETTLE 读取文本信息添加时间字段

    转换: https://blog.csdn.net/care_about_people/article/details/44960193 KETTLE 读取文本信息添加时间字段:  https://b ...

  6. Kettle使用_24 Kettle输入输出组件汇总

    Kettle使用_24 kettle输入输出组件汇总 需求:通过Kettle实现文本文件.固定宽度文件输入.表输入.XML数据输入.JSON数据输入.表输入等输入和相应的输出. 解决方法:通过文本文件 ...

  7. 【MM系列】SAP ABAP 编辑字段出现:对象编辑中的错误

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP ABAP 编辑字段出现: ...

  8. odoo10参考系列--ORM API 三(字段、继承与扩展、域和更新到新API)

    字段 基础字段 class odoo.fields.Field(string=<object object>, **kwargs) 字段描述符包含字段定义,并管理记录中相应字段的访问和分配 ...

  9. 若依@Excel注解自动获取导出字段,字典解析

    若依系统中实体类导出字段使用了@Execl 若不是若依系统 最后附有excel接口 如导出加上@Excel(name = "字段名") 需要导出数值的中文解析 则加上dictTyp ...

最新文章

  1. eclipse从入门到精通_JAVA成长之路入门学习路线
  2. React开发(154):注意div得写法
  3. ORA-02292:integrity constraint(xx) violated - child record found 外键关联,无法删除记录
  4. Django:ORM基本操作-CRUD,管理器对象objects,----->删除:删除单个数据,删除批量数据
  5. ubuntu环境下,ubuntu16.04装机到nvdia显卡驱动安装、cuda8安装、cudnn安装
  6. cJSON解析和打包
  7. BZOJ3744 Gty的妹子序列(分块+树状数组)
  8. 在线swf转html,swf转换器
  9. 二维连续傅里叶变换对
  10. 国培计算机培训奥鹏,3515011349奥鹏国培培训网络研修总结
  11. 多点温度检测上位机显示_基于51单片机的多点温度检测系统设计
  12. ubuntu 16.04 编译opencv3.1,opencv多版本切换
  13. if __name__ == '__mian__'的作用?
  14. Delphi7学习记录-demo实例
  15. 肝了一宿才收集的48个超炫酷的 CSS 文字特效,绝对值得收藏!!!
  16. Python数据可视化(微课版)-简介
  17. 小程序手势返回以及手机自带返回功能问题解决思路
  18. 推荐一款webstorm的主题,类似vscode的黑色主题,习惯vscode的用户可以试试
  19. 【从零开始数学建模(1)】第一章 建立数学模型~导论
  20. 微信吸粉技巧:“傻逼”的毅力

热门文章

  1. NOIP模拟题——计数
  2. Hadoop 在 windows 7 64位的配置(一)|非cygwin
  3. html table的边框线怎么变圆角_实现CSS3中的border-radius(边框圆角)示例代码
  4. 二进制漏洞利用原理--栈溢出
  5. (59)简单介绍RAM IP核类型和接口信号?
  6. (52)FPGA基础编码D触发器(一)
  7. (09)System Verilog 父类与子类成员变量同名冲突
  8. c++ 写入文件_Python学习第52课-写入文件
  9. nexttick使用场景_使用Jest实现Vue自动化测试
  10. 蓝桥杯单片机:12届省赛