文章目录

  • 前言
  • kettle - 清洗 mongodb 数据案例
  • 一、需求
  • 二、kettle开发
  • 1、新建mongodb数据查询
  • 2、配置kettleTest集合与清洗后kettleTestClear集合字段映射
  • 3、根据_id进行排序
  • 4、使用java脚本将日期格式化
  • 5、进行字段选择
  • 6、将delete字段进行值映射
  • 7、mongo输出
  • 8、最后加一个写日志组件方便记录
  • 三、测试
  • 到此案例演示结束!!!



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开发

整体流程:

kettle MongoDB 查询 kettle抽取mongodb_字段

1、新建mongodb数据查询

查询kettleTest.delete:false的数据:

kettle MongoDB 查询 kettle抽取mongodb_字段_02

kettle MongoDB 查询 kettle抽取mongodb_nosql_03

kettle MongoDB 查询 kettle抽取mongodb_数据库_04


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_05

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

kettle MongoDB 查询 kettle抽取mongodb_字段_06


kettle MongoDB 查询 kettle抽取mongodb_mongodb_07


kettle MongoDB 查询 kettle抽取mongodb_mongodb_08


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_09


kettle MongoDB 查询 kettle抽取mongodb_数据库_10


kettle MongoDB 查询 kettle抽取mongodb_mongodb_11


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

3、根据_id进行排序

kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_12


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_13


kettle MongoDB 查询 kettle抽取mongodb_mongodb_14

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

kettle MongoDB 查询 kettle抽取mongodb_mongodb_15


kettle MongoDB 查询 kettle抽取mongodb_字段_16


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_17

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、进行字段选择

kettle MongoDB 查询 kettle抽取mongodb_数据库_18


kettle MongoDB 查询 kettle抽取mongodb_数据库_19


kettle MongoDB 查询 kettle抽取mongodb_数据库_20


kettle MongoDB 查询 kettle抽取mongodb_mongodb_21

6、将delete字段进行值映射

选择值映射

kettle MongoDB 查询 kettle抽取mongodb_字段_22


kettle MongoDB 查询 kettle抽取mongodb_字段_23


kettle MongoDB 查询 kettle抽取mongodb_数据库_24

7、mongo输出

kettle MongoDB 查询 kettle抽取mongodb_mongodb_25


kettle MongoDB 查询 kettle抽取mongodb_数据库_26


kettle MongoDB 查询 kettle抽取mongodb_mongodb_27


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_28


kettle MongoDB 查询 kettle抽取mongodb_kettle MongoDB 查询_29


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

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

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

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

kettle MongoDB 查询 kettle抽取mongodb_nosql_30


kettle MongoDB 查询 kettle抽取mongodb_nosql_31

三、测试

执行kettle:

kettle MongoDB 查询 kettle抽取mongodb_字段_32


查看执行后的结果:

kettle MongoDB 查询 kettle抽取mongodb_mongodb_33

到此案例演示结束!!!