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导出百万级数据,挺快的)...相关推荐

  1. kettle分批处理大表数据_kettle 分批次拿数据库

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  2. kettle分批处理大表数据_采用Kettle分页处理大数据量抽取任务

    需求: 将Oracle数据库中某张表历史数据导入MySQL的一张表里面. 源表(Oracle):table1 目标表(MySQL):table2 数据量:20,000,000 思路: 由于服务器内存资 ...

  3. kettle分批处理大表数据_kettle-批量同步表数据

    一.实验目标 利用kettle实现从mysql数据库中的dbf库批量同步表到dbm库(全量同步) 二.实验环境 dbf  库中表f1.f2.f3  .f1中1条数据,f2中100条数据,f3中2条数据 ...

  4. Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率

    业务:需要从一个数据库查询百万级数据,在java程序中插入到另一个oracle数据库中 代码: private final int persize = 1000; /** * 推送数据-流程 * @p ...

  5. MYSQL百万级数据,如何优化

    MYSQL百万级数据,如何优化 首先,数据量大的时候,应尽量避免全表扫描,应考虑在 where 及 order by 涉及的列上建立索引,建索引可以大大加快数据的检索速度.但是,有些情况索引是不会起效 ...

  6. 百万级数据量,千万级数据量是多少,海量数据的优化方案

    百万级数据量,千万级数据量是多少? 这里的百万级,千万级,针对数据库,指的是表的数据条数.有时也指并发事务量. 海量数据的优化方案 Note:    具体优化要结合自身的业务特性 百万级: 这个数据量 ...

  7. php导出1万条数据excel_PHP快速导出百万级数据到CSV或者EXCEL文件

    前言: 很多时候,因为数据统计,我们需要将数据库的数据导出到Excel等文件中,以供数据人员进行查看,如果数据集不大,其实很容易:但是如果对于大数集的导出,将要考虑各种性能的问题,这里以导出数据库一百 ...

  8. 利用SQl对数据库实行数据拆分与组合

    利用SQl对数据库实行数据拆分与组合实现提供以下几种方案: 方法一: WITH CTE AS ( SELECT A.Id,A.[Uid],UserName FROM ( SELECT A.[id], ...

  9. 使用POI导出百万级数据到excel的解决方案

    使用POI导出百万级数据到excel的解决方案 参考文章: (1)使用POI导出百万级数据到excel的解决方案 (2)https://www.cnblogs.com/hxun/p/11419006. ...

最新文章

  1. SMAT,PacBio
  2. php面试框架的执行流程图,ThinkPHP2.2框架执行流程图,ThinkPHP控制器的执行流程
  3. Oracle 常用命令 及近期使用问题集合
  4. php json传值ajax,ajax 与PHP json 传值
  5. java web 项目在tomcat上显示空白页的解决
  6. MAT之SA:利用SA算法解决TSP(数据是14个虚拟城市的横纵坐标)问题
  7. JAVA复习(对象的克隆、正则表达式)
  8. 前端学习(1521):vue-cli工具介绍
  9. 论文浅尝 | 基于迭代的概率规则约束的知识图谱分布式表示
  10. easyExcel 使用指南详解
  11. Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析(2)
  12. 500种精美字体下载,做设计做视频必备!
  13. Air720x(3229)系列4G模块设计手册
  14. 制作u盘winpe启动盘_u盘启动盘制作工具 纯净+好用,原来不止是 微pe
  15. 静态网页/动态网页/伪静态网页/动态HTML
  16. cad面积计算机,用cad计算多个面积的方法步骤
  17. python做excel数据条件_懂点EXCEL就行!教你利用Python做数据筛选(上)
  18. 记录一次我是如何爬了某学校近2w学生信息的!
  19. react 是怎么运行的?
  20. 如何编写Linux 下的 USB 键盘驱动

热门文章

  1. 最小堆(MinHeap)
  2. 在photoshop下安装Imagenomic_Portraiture(磨皮插件)图解全过程
  3. 运营中 知识付费虚拟资源交易平台带支付主题源码
  4. 陀螺仪加速度计磁罗盘的校准
  5. 几种常见的功能性脑网络划分方式
  6. k8s关于node节点NotReady的解决
  7. JDK版本更迭 的历史---转载
  8. 【大数据】中国工程院院士何友:工业大数据及其应用
  9. 详解 Linux操作系统的目录结构
  10. HDU A strange lift