kettle分批处理大表数据_Kettle大量数据快速导出的解决方案(利用SQL导出百万级数据,挺快的)...
org.apache.commons
commons-vfs2
2.0
org.scannotation
scannotation
1.0.3
dom4j
dom4j
1.6.1
pentaho-kettle
kettle-vfs
5.2.0.0
pentaho
pentaho-kettle
kettle-engine
5.2.0.0
pentaho-kettle
kettle-core
5.2.0.0
OK,准备工作完成后开始编写Kettle工具类:
//
//Source code recreated from a .class file by IntelliJ IDEA//(powered by Fernflower decompiler)//import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.net.URLDecoder;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.pentaho.di.core.KettleEnvironment;
import org.pentaho.di.trans.Trans;
import org.pentaho.di.trans.TransMeta;public classKettle {publicKettle() {
}public staticInputStream export(String sql, String savePath, String hostIp, String dbName, String port, String userName, String password) {
FileInputStreamin = null;try{
HttpServletResponse response=ServletActionContext.getResponse();
URL url= Kettle.class.getResource("/");
String paths= url.getFile().substring(0, url.getFile().indexOf("classes"));
paths=URLDecoder.decode(paths);
Long times=System.currentTimeMillis();
File path= newFile(savePath);if (!path.exists() && !path.isDirectory()) {
path.mkdir();
path.canWrite();
}
KettleEnvironment.init();
TransMeta tm= new TransMeta(paths + "classes/" + "export.ktr");
Trans trans= newTrans(tm);
trans.setVariable("hostIp", hostIp);
trans.setVariable("dbName", dbName);
trans.setVariable("port", port);
trans.setVariable("userName", userName);
trans.setVariable("password", password);
trans.setVariable("sql", sql);
trans.setVariable("savePath", savePath + "/" +times);
trans.prepareExecution((String[])null);
trans.startThreads();
trans.waitUntilFinished();
File file= new File(savePath + "/" + times + ".xlsx");
File file2= new File(savePath + "/" + times + ".xls");
ServletOutputStreamout;if(file.exists()) {in = newFileInputStream(file);
response.reset();
response.setContentType("application/x-download;charset=UTF-8");
response.addHeader("Content-Disposition", "attachment;filename='" + times + ".xlsx'");
response.addHeader("Content-Length", String.valueOf(file.length()));out =response.getOutputStream();
writeFile(out, in);
file.delete();
}else if(file2.exists()) {in = newFileInputStream(file2);
response.reset();
response.setContentType("application/x-download;charset=UTF-8");
response.addHeader("Content-Disposition", "attachment;filename='" + times + ".xls'");
response.addHeader("Content-Length", String.valueOf(file2.length()));out =response.getOutputStream();
writeFile(out, in);
file2.delete();
}else{
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer=response.getWriter();
writer.write("");
}
}catch(Exception var18) {
var18.printStackTrace();
}return in;
}public static voidwriteFile(OutputStream fos, InputStream fis) throws IOException {byte[] buffer = new byte[1024];
boolean var3= false;intlen;while((len = fis.read(buffer)) > 0) {
fos.write(buffer,0, len);
fos.flush();
}
fis.close();
fos.close();
}
}
以上工具类要读取一个export.ktr的文件,我们把它放在\src\main\java下(当然你也可以放在你想要的路径下,修改以上程序能获取到就是了),记得打包不要排除了,不然找不到
export.ktr文件内容(拷贝我的就行,如果不能使用自己去网上找个,百度下里面参数意思,数据库我用的mysql):
export
Normal
0
/
ID_BATCH
Y
ID_BATCH
CHANNEL_ID
Y
CHANNEL_ID
TRANSNAME
Y
TRANSNAME
STATUS
Y
STATUS
LINES_READ
Y
LINES_READ
LINES_WRITTEN
Y
LINES_WRITTEN
LINES_UPDATED
Y
LINES_UPDATED
LINES_INPUT
Y
LINES_INPUT
LINES_OUTPUT
Y
LINES_OUTPUT
LINES_REJECTED
Y
LINES_REJECTED
ERRORS
Y
ERRORS
STARTDATE
Y
STARTDATE
ENDDATE
Y
ENDDATE
LOGDATE
Y
LOGDATE
DEPDATE
Y
DEPDATE
REPLAYDATE
Y
REPLAYDATE
LOG_FIELD
Y
LOG_FIELD
EXECUTING_SERVER
N
EXECUTING_SERVER
EXECUTING_USER
N
EXECUTING_USER
CLIENT
N
CLIENT
ID_BATCH
Y
ID_BATCH
SEQ_NR
Y
SEQ_NR
LOGDATE
Y
LOGDATE
TRANSNAME
Y
TRANSNAME
STEPNAME
Y
STEPNAME
STEP_COPY
Y
STEP_COPY
LINES_READ
Y
LINES_READ
LINES_WRITTEN
Y
LINES_WRITTEN
LINES_UPDATED
Y
LINES_UPDATED
LINES_INPUT
Y
LINES_INPUT
LINES_OUTPUT
Y
LINES_OUTPUT
LINES_REJECTED
Y
LINES_REJECTED
ERRORS
Y
ERRORS
INPUT_BUFFER_ROWS
Y
INPUT_BUFFER_ROWS
OUTPUT_BUFFER_ROWS
Y
OUTPUT_BUFFER_ROWS
ID_BATCH
Y
ID_BATCH
CHANNEL_ID
Y
CHANNEL_ID
LOG_DATE
Y
LOG_DATE
LOGGING_OBJECT_TYPE
Y
LOGGING_OBJECT_TYPE
OBJECT_NAME
Y
OBJECT_NAME
OBJECT_COPY
Y
OBJECT_COPY
REPOSITORY_DIRECTORY
Y
REPOSITORY_DIRECTORY
FILENAME
Y
FILENAME
OBJECT_ID
Y
OBJECT_ID
OBJECT_REVISION
Y
OBJECT_REVISION
PARENT_CHANNEL_ID
Y
PARENT_CHANNEL_ID
ROOT_CHANNEL_ID
Y
ROOT_CHANNEL_ID
ID_BATCH
Y
ID_BATCH
CHANNEL_ID
Y
CHANNEL_ID
LOG_DATE
Y
LOG_DATE
TRANSNAME
Y
TRANSNAME
STEPNAME
Y
STEPNAME
STEP_COPY
Y
STEP_COPY
LINES_READ
Y
LINES_READ
LINES_WRITTEN
Y
LINES_WRITTEN
LINES_UPDATED
Y
LINES_UPDATED
LINES_INPUT
Y
LINES_INPUT
LINES_OUTPUT
Y
LINES_OUTPUT
LINES_REJECTED
Y
LINES_REJECTED
ERRORS
Y
ERRORS
LOG_FIELD
N
LOG_FIELD
ID_BATCH
Y
ID_BATCH
CHANNEL_ID
Y
CHANNEL_ID
LOG_DATE
Y
LOG_DATE
METRICS_DATE
Y
METRICS_DATE
METRICS_CODE
Y
METRICS_CODE
METRICS_DESCRIPTION
Y
METRICS_DESCRIPTION
METRICS_SUBJECT
Y
METRICS_SUBJECT
METRICS_TYPE
Y
METRICS_TYPE
METRICS_VALUE
Y
METRICS_VALUE
0.0
0.0
10000
50
50
N
Y
50000
Y
N
1000
100
-
2016/03/01 17:21:47.083
-
2016/09/01 09:29:12.684
H4sIAAAAAAAAAAMAAAAAAAAAAAA=
N
111
${hostIp}
MYSQL
Native
${dbName}
${port}
${userName}
${password}
EXTRA_OPTION_MYSQL.defaultFetchSize
500
EXTRA_OPTION_MYSQL.useCursorFetch
true
FORCE_IDENTIFIERS_TO_LOWERCASE
N
FORCE_IDENTIFIERS_TO_UPPERCASE
N
IS_CLUSTERED
N
PORT_NUMBER
${port}
PRESERVE_RESERVED_WORD_CASE
N
QUOTE_ALL_FIELDS
N
STREAM_RESULTS
Y
SUPPORTS_BOOLEAN_DATA_TYPE
Y
SUPPORTS_TIMESTAMP_DATA_TYPE
Y
USE_POOLING
N
表输入
Excel输出
Y
Excel输出
ExcelOutput
Y
1
none
Y
N
UTF-8
N
Y
${savePath}
xls
N
N
N
N
N
N
Sheet1
Y
N
N
Encrypted
0
N
N
N
C:\Users\47\Desktop\通用模板.xls
arial
10
Y
N
no
horizontal
white
dark_teal
320
center
arial
10
black
none
544
176
Y
表输入
TableInput
N
1
none
111
${sql}
0
N
Y
N
272
176
Y
N
主方法里调用:
Kettle.export(sql, SystemConstant.EXPORT_PATH, "数据库IP", "数据库名字", "数据库端口", "数据库账号", "数据库密码");
你也可以用Springboot整合,有对应maven及配置,自行查资料。
效率测试:
*导出10w行记录
执行时间: 1133ms
执行时间: 1082ms
执行时间: 1096ms
* 导出100w行记录
执行时间: 39784ms
执行时间: 8566ms
执行时间: 8622ms
* Excel 2007行数极限 1048575 执行时间: 9686ms
第一次导数据要加载kettle组件运行稍慢,后面几次再导数据速度就飞快了,更多结果有兴趣的可以去试试。
kettle分批处理大表数据_Kettle大量数据快速导出的解决方案(利用SQL导出百万级数据,挺快的)...相关推荐
- kettle分批处理大表数据_kettle 分批次拿数据库
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- kettle分批处理大表数据_采用Kettle分页处理大数据量抽取任务
需求: 将Oracle数据库中某张表历史数据导入MySQL的一张表里面. 源表(Oracle):table1 目标表(MySQL):table2 数据量:20,000,000 思路: 由于服务器内存资 ...
- kettle分批处理大表数据_kettle-批量同步表数据
一.实验目标 利用kettle实现从mysql数据库中的dbf库批量同步表到dbm库(全量同步) 二.实验环境 dbf 库中表f1.f2.f3 .f1中1条数据,f2中100条数据,f3中2条数据 ...
- Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率
业务:需要从一个数据库查询百万级数据,在java程序中插入到另一个oracle数据库中 代码: private final int persize = 1000; /** * 推送数据-流程 * @p ...
- MYSQL百万级数据,如何优化
MYSQL百万级数据,如何优化 首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是不会起效 ...
- 百万级数据量,千万级数据量是多少,海量数据的优化方案
百万级数据量,千万级数据量是多少? 这里的百万级,千万级,针对数据库,指的是表的数据条数.有时也指并发事务量. 海量数据的优化方案 Note: 具体优化要结合自身的业务特性 百万级: 这个数据量 ...
- php导出1万条数据excel_PHP快速导出百万级数据到CSV或者EXCEL文件
前言: 很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易:但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百 ...
- 利用SQl对数据库实行数据拆分与组合
利用SQl对数据库实行数据拆分与组合实现提供以下几种方案: 方法一: WITH CTE AS ( SELECT A.Id,A.[Uid],UserName FROM ( SELECT A.[id], ...
- 使用POI导出百万级数据到excel的解决方案
使用POI导出百万级数据到excel的解决方案 参考文章: (1)使用POI导出百万级数据到excel的解决方案 (2)https://www.cnblogs.com/hxun/p/11419006. ...
最新文章
- SMAT,PacBio
- php面试框架的执行流程图,ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程
- Oracle 常用命令 及近期使用问题集合
- php json传值ajax,ajax 与PHP json 传值
- java web 项目在tomcat上显示空白页的解决
- MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题
- JAVA复习(对象的克隆、正则表达式)
- 前端学习(1521):vue-cli工具介绍
- 论文浅尝 | 基于迭代的概率规则约束的知识图谱分布式表示
- easyExcel 使用指南详解
- Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析(2)
- 500种精美字体下载,做设计做视频必备!
- Air720x(3229)系列4G模块设计手册
- 制作u盘winpe启动盘_u盘启动盘制作工具 纯净+好用,原来不止是 微pe
- 静态网页/动态网页/伪静态网页/动态HTML
- cad面积计算机,用cad计算多个面积的方法步骤
- python做excel数据条件_懂点EXCEL就行!教你利用Python做数据筛选(上)
- 记录一次我是如何爬了某学校近2w学生信息的!
- react 是怎么运行的?
- 如何编写Linux 下的 USB 键盘驱动