文章目录
- 前言
- 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开发
整体流程:
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:
查看执行后的结果: