使用 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数据算出每个表页码
java
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 {
/**
* 计算分页数据
*/
@Test
public void synchronousRead() {
String fileName = "D:\\software\\project\\company_project\\zhtc_pd\\db_job\\db_list.xls";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 同步读取会自动finish
List<TablePageNum> list = EasyExcel.read(fileName).head(TablePageNum.class).sheet().doReadSync();
//移除pagesize==0
List<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);
}
}
输出页码数据
第三部:
读取页码数据循环查询数据插入到新库