如何使用kettle 做数据清洗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用kettle 做数据清洗相关的知识,希望对你有一定的参考价值。

参考技术A 在kettle常常有处理从一个源数据中做转换.做转换的时候, 需要去查另一个数据库. 这种问题遇到数据小时候还好办. 但是数据魇 时候就麻烦来了. 下面针对三种情况做具体情况的选择办法 先上一个图 [img] [/img] 1. 当需要转换的数据特别大的时候,

kettle - 清洗 mongodb 数据案例

文章目录

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


kettle - 清洗 mongodb 数据案例

一、需求

需求:将 mongodb kettleTest集合脏数据 整理 到 kettleTestClear集合中
mongodb 待清洗的数据:
db.kettleTest.find();

[
  
    "_id": "12",
    "_class": "com.yzy.mongodb.model.KettleTestModel",
    "createTime": "$date": "2022-12-28T10:01:38.989Z",
    "delete": false,
    "kettleVo": 
      "list": ["1"],
      "key": "a",
      "code": "A"
    ,
    "name": "哈哈"
  ,
  
    "_id": "13",
    "_class": "com.yzy.mongodb.model.KettleTestModel",
    "createTime": "$date": "2022-12-28T10:01:42.001Z",
    "delete": false,
    "kettleVo": 
      "list": ["1", "2"],
      "code": "B"
    ,
    "name": "一模块"
  ,
  
    "_id": "14",
    "_class": "com.yzy.mongodb.model.KettleTestModel",
    "createTime": "$date": "2022-12-28T10:01:45.004Z",
    "delete": false,
    "kettleVo": 
      "key": "c",
      "code": "C"
    ,
    "name": "萨迪"
  ,
  
    "_id": "23",
    "_class": "com.yzy.mongodb.model.KettleTestModel",
    "delete": false,
    "kettleVo": 
      "key": "d",
      "code": "D"
    ,
    "name": "都是"
  ,
  
    "_id": "15",
    "_class": "com.yzy.mongodb.model.KettleTestModel",
    "createTime": "$date": "2022-12-28T10:01:51.013Z",
    "delete": false,
    "name": "是南方"
  
]

需求点:
1)待清洗集合和清洗后集合字段映射关系:
kettleTest.createTime -> kettleTestClear.createTime
kettleTest.name -> kettleTestClear.name
kettleTest.kettleVo.key -> kettleTestClear.key
kettleTest.kettleVo.code-> kettleTestClear.code
kettleTest.kettleVo.list -> kettleTestClear.list
kettleTest.delete -> kettleTestClear.delete
2)只清洗kettleTest.delete:false 的数据;
3)同时将delete字段的值映射后导入kettleTestClear集合中,映射关系: true:0,false:1;
4)根据_id进行排序后存入kettleTestClear集合;

二、kettle开发

整体流程:

1、新建mongodb数据查询

查询kettleTest.delete:false的数据:


2、配置kettleTest集合与清洗后kettleTestClear集合字段映射







注意:
1、_id放在最上面,因为它永远不会为空;
2、其中createTime这里是重点要加.$date;

3、根据_id进行排序



4、使用java脚本将日期格式化



import java.text.ParseException;
import java.util.Date;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd  HH:mm:ss.SSS");
private static final String TIME_LINE = "yyyy-MM-dd'T'HH:mm:ss.SSSXX";
public static String dateToString(Date date) 
           return sdf.format(date);

public static Date stringToDate(String date, String format) throws  ParseException 
      DateFormat dateFormat = new SimpleDateFormat(format);
      dateFormat.setLenient(false);
      return dateFormat.parse(date);

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws  KettleException,ParseException 
  if (first) 
    first = false;
  
  Object[] r = getRow();
  if (r == null ) 
    setOutputDone();
    return false;
  
   
  r = createOutputRow(r, data.outputRowMeta.size());
  String createTime = get(Fields.In, "createTime").getString(r);
  if(null != createTime && "" != createTime)
    //时间格式化
    get(Fields.Out, "createTime").setValue(r,  dateToString(stringToDate(createTime,TIME_LINE)));
  else
    get(Fields.Out, "createTime").setValue(r, null);
  
  
  logBasic("----------"+createTime+"---------------");
  putRow(data.outputRowMeta, r);
  return true;

5、进行字段选择




6、将delete字段进行值映射

选择值映射


7、mongo输出






使用Get DBs按钮和Get collection按钮分别检索选定数据库中现有数据库和集合,如果输入一个集合名字,这个集合名字在数据库中不存在,那么会自动创建一个集合,并且将对应数据插入该集合中。

Truncate collection 如果勾上之后,在插入目标集合之前会把集合数据清空,然后再插入

这里有个问题?
kettleTest.kettleVo.list -> kettleTestClear.list
会从List类型变成String类型,因为我在输出流字段配置中没有发现Object,所以没有找到好的办法,也许有大佬知道如何去做,
那麻烦告知一下,共同进步哈。

8、最后加一个写日志组件方便记录


三、测试

执行kettle:

查看执行后的结果:

到此案例演示结束!!!

以上是关于如何使用kettle 做数据清洗的主要内容,如果未能解决你的问题,请参考以下文章

Kettle的使用——大数据清洗技术

kettle - 清洗 mongodb 数据案例

kettle - 清洗 mongodb 数据案例

kettle - 清洗 mongodb 数据案例

Kettle-7.0增量抽取订单数据

Kettle-7.0增量抽取订单数据