kettle 数据库迁移 使用分页原理实现 数据库mysql

news2024/11/15 11:59:57

使用 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 {
    /**
     * 计算分页数据
     */
    @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);
    }
}

输出页码数据

第三部:

读取页码数据循环查询数据插入到新库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2129476.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(一)模式识别——基于SVM的道路分割实验(附资源)

写在前面&#xff1a;本报告所有代码公开在附带资源中&#xff0c;无法下载代码资源的伙伴私信留下邮箱&#xff0c;小编24小时内回复 一、实验目的 1、实验目标 学习掌握SVM&#xff08;Support Vector Machine&#xff09;算法思想&#xff0c;利用MATLAB的特定工具箱和库函…

MFC工控项目实例之十四模拟量信号名称从文件读写

承接专栏《MFC工控项目实例之十三从文件读写板卡信号名称》 在BoardTest.cpp文件中添加代码 int m_CountGetCurSel_AD[16];//索引号 UINT m_CountComboID_AD[16]//控件ID号{IDC_COMBO33,IDC_COMBO34,IDC_COMBO35,IDC_COMBO36,IDC_COMBO37,IDC_COMBO38,IDC_COMBO39,IDC_COMBO40…

语言模型微调:提升语言Agent性能的新方向

人工智能咨询培训老师叶梓 转载标明出处 大多数语言Agent依赖于少量样本提示技术&#xff08;few-shot prompting&#xff09;和现成的语言模型。这些模型在作为Agent使用时&#xff0c;如生成动作或自我评估&#xff0c;通常表现不佳&#xff0c;且鲁棒性差。 论文《FIREACT…

2024外滩大会:远的更近 旧的更新

文 | 大力财经 导语&#xff1a;2024 外滩大会圆满落幕&#xff01;未来更近了&#xff0c;旧的更创新了。全球 500 多位精英齐聚&#xff0c;50 余家企业 “招才”。在这里&#xff0c;我们不仅看到未来商业形态&#xff0c;更望见未来的影子。 为期三天的2024外滩大会圆满落幕…

flv复合流

一、什么是flv flv流媒体协议是Adobe公司推出的一种流媒体协议。其特点就是封装后的音视频数据量很小&#xff0c;并且协议规范相对简单&#xff0c;所以FLV流媒体协议适合网络传输&#xff0c;但是他是一个私有协议&#xff0c;所支持的网络传输比较有限&#xff1a;如RTMP、H…

Mysql异常断电InnoDB损坏处理

一、mysql启动报错信息收集 1、截图 [ERROR] InnoDB: Database page corruption on disk or a failed file read of page [page id: space0, page number203]. You may have to recover from a backup. Jun 27 13:30:06 localhost mysqld: 2024-06-27T13:30:06.14747208:00 0 …

意气实体过程函数论3

意气实体过程函数论3 和悦空间 y i y_i yi​才气的意气实体过程逻辑定义哥德尔数数理逻辑简称逻辑&#xff1b;明明德数符号琴语言数据结构王阳明群表示&#xff0c;被称为才气群表示论&#xff1b; 从劳动力关系向量到生产力配分函数算法为己之学模拟器接口函数声明内核与插件…

【JAVA入门】Day42 - 转换流

【JAVA入门】Day42 - 转换流 文章目录 【JAVA入门】Day42 - 转换流 转换流是字符流和字节流之间的桥梁。 转换流中的输入流叫做 InputStreamReader&#xff0c;它可以把字节流转换为字符流。 转换流的输出流叫做 OutputStreamWriter&#xff0c;它可以把字符流…

JAVA并发编程ReentrantLock核心原理剖析

JAVA并发编程系列以及陆续出了5篇&#xff0c;第六篇的主角ReentrantLock该出场了。之前《一文看懂全部锁机制》谈到可重入锁、《JAVA并发编程AQS原理剖析》谈到了JUC灵魂AQS&#xff0c;那么AQS的思想优秀实践者ReentrantLock是怎么实现AQS的呢&#xff1f; 1、ReentrantLock是…

Unity笔记:ScrollRect代码阅读

大体流程 Unity Docs - UGUI | Class ScrollRect 总的说 自身不负责Rebuild&#xff0c;设置脏之后交由LayoutRebuilder注册到CanvasUpdateRegistry里待rebuild的集合在固定时机统一Rebuild。自身只在Prelayout和Postlayout做一下数据准备和数据更新 自身的ICanvasElement.…

判断是否在同一个键盘行

给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 "qwertyuiop" 组成。第二行由字符 "asdfghjkl" 组成。第三行由字符 "zxcvbnm" 组成。…

构建医护人员排班系统:Spring Boot的实践与探索

相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统&#xff0c;它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等&#xff0c;非常适…

如何使用UltraISO(软碟通)制作U盘启动盘

一、打开UltralSO.exe、先格式化U盘&#xff0c;文件 -> 打开 找到要刻录的ISO镜像文件&#xff1b; 二、选择你的U盘。U盘会在左下角出现&#xff0c;点击便可。 三、启动->写入磁盘映像&#xff1b; 四、写入方式选择 "USB-HDD"&#xff0c;点击“写入”按钮…

ZeroTier 内网穿透工具在 Linux 上的安装与配置教程

感谢浪浪云支持发布 浪浪云活动链接 &#xff1a;https://langlangy.cn/?i8afa52 文章目录 1. 安装 ZeroTier1.1 系统需求1.2 更新系统软件包1.3 安装 curl1.4 安装 ZeroTier1.5 启动 ZeroTier 服务1.6 验证安装 2. 创建和管理虚拟网络2.1 注册和登录2.2 创建新网络2.3 配置网…

【嘶吼文化-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

私有VLAN,从原理到配置,全给你说明白

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 晚上好&#xff0c;我的网工朋友 传统的VLAN划分虽然能够有效地隔离不同部门或功能区域的网络流量&#xff0c;但在某些情况下&#xff0c;比如共…

【JSP `page` 指令详解:构建高效的动态网页】

JSP page 指令详解&#xff1a;构建高效的动态网页 在 JavaServer Pages (JSP) 中&#xff0c;<% page %> 指令用于配置 JSP 页面的一些关键属性。这些属性控制着页面的行为和生成的 Servlet 的特性&#xff0c;例如字符编码、是否启用会话、缓冲区大小等。合理使用 page…

​了解MySQL 的二进制日志文件​Binlog

1. SQL 语句的几种类型 首先介绍一下&#xff0c;对于一个 SQL 语句&#xff0c;它常常被分为以下几种类型&#xff1a; DDL&#xff08;Data Definition Language&#xff0c;数据定义语言&#xff09;&#xff1a;用来操作数据库、表、列等&#xff0c;比如 CREATE、ALTER…

VSCode 创建Python 项目(最简单,最少步骤,无痛从pycharm迁移项目)

第一步&#xff1a;下载 下载地址&#xff1a;https://code.visualstudio.com/docs/?dvwin64user 第二步&#xff1a;配置 2.1&#xff1a;VsCode设置中文 按住键盘上的“CtrlShiftP”组合键&#xff0c;打开命令面板。 在命令面板中输入“Configure Display Language”。点击…