使用 kettle 9.0
先修改配置文件:
C:\Users\xx\.kettle
新增如下配置,解决mysql 空字符串 自动转 null bug
KETTLE_EMPTY_STRING_DIFFERS_FROM_NULL=Y
git地址: GitHub - 2292011451/kettle_tool
第一步:
先把要迁移的表进行读取,循环查询每个表的最大数量以及页数,追加到excel
第二部:
使用java代码读取excel数据算出每个表页码
package com.hw.payment.test;import com.alibaba.excel.EasyExcel;
import org.junit.Test;
import org.springframework.beans.BeanUtils;import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;public class TableTest {/*** 计算分页数据*/@Testpublic void synchronousRead() {String fileName = "D:\\software\\project\\company_project\\zhtc_pd\\db_job\\db_list.xls";// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finishList<TablePageNum> list = EasyExcel.read(fileName).head(TablePageNum.class).sheet().doReadSync();//移除pagesize==0List<TablePageNum> collect = list.stream().filter(x -> x.getPageNum() != 0).collect(Collectors.toList());//正序排序List<TablePageNum> sortedPeople = collect.stream().sorted(Comparator.comparingLong(TablePageNum::getMaxNum).thenComparing(TablePageNum::getPageNum)).collect(Collectors.toList());Long sortedPeopleNum = sortedPeople.stream().map(TablePageNum::getMaxNum).reduce(0L, Long::sum);//按大小切割数据Long maxNum = 0L;List<TablePageNum> dataList = new ArrayList<>();List<List<TablePageNum>> datas = new ArrayList<>();boolean b = sortedPeople.size() == 1;if (b) {datas.add(dataList);} else {for (TablePageNum sortedPerson : sortedPeople) {maxNum += sortedPerson.getMaxNum();if (maxNum <= 7000000) {dataList.add(sortedPerson);} else if (maxNum > 7000000 && maxNum < 12000000) {dataList.add(sortedPerson);datas.add(dataList);dataList = new ArrayList<>();maxNum = 0L;} else {dataList.add(sortedPerson);datas.add(dataList);dataList = new ArrayList<>();maxNum = 0L;}}}Long maxNumNew = 0L;for (int k = 0; k < datas.size(); k++) {List<TablePageNum> tablePageNums = datas.get(k);List<TablePageNum> dataNew = new ArrayList<>();for (TablePageNum tablePageNum : tablePageNums) {maxNumNew += tablePageNum.getMaxNum();//排除定时任务等表boolean contains = true;String[] tables = {"qrtz"};for (String table : tables) {//排除表contains = tablePageNum.getTableName().contains(table);if (contains) {contains = false;break;}}if (!contains) {Integer pageNum = tablePageNum.getPageNum();Integer pageSize = tablePageNum.getPageSize();for (int i = 1; i <= pageNum; i++) {TablePageNum data = new TablePageNum();int pageNumIndex = (i - 1) * pageSize;BeanUtils.copyProperties(tablePageNum, data);data.setPageNum(pageNumIndex);dataNew.add(data);}}}String fileNameOut = "D:\\software\\project\\company_project\\zhtc_pd\\db_job\\page_data\\db_list" + k + ".xlsx";// 这里 需要指定写用哪个class去写,然后写到第一个sheet,名字为模板 然后文件流会自动关闭// 如果这里想使用03 则 传入excelType参数即可EasyExcel.write(fileNameOut, TablePageNum.class).sheet("模板").doWrite(dataNew);}System.out.println(sortedPeopleNum + ":" + maxNumNew);}
}
输出页码数据
第三部:
读取页码数据循环查询数据插入到新库