kettle 查询数据库写入文件_ETL KETTLE 读取csv文件写入数据库

本文介绍了如何使用Kettle进行批量导入CSV文件到数据库的过程。通过创建Kettle项目文件,结合CSV文件输入、Java代码和SQL脚本,实现自动化的ETL过程。具体步骤包括获取文件名,解析CSV数据,使用Java代码处理字段和表名,以及执行SQL脚本插入数据。
摘要由CSDN通过智能技术生成

任务:

将大量CSV文件写入数据库中;可以一张表一个csv文件输入,表输出;但是如果表文件太多,达到100多张表入库;那会写死人的;所以我们可以偷懒一下;采用配合kettle java脚本代码;完成任务;

场景:将下面文件写入数据中:文件名和表名对应关系如下:

文件名 表名

ccs_A_20190101.csv ccs_A

ccs_B_20190101.csv ccs_B

.......

文件格式:

字段1|+|字段2|+|字段3|+|字段4|+|.......|+|字段n

value1|+|Value2|+|value3|+||+|.........|+|valuen

实现:

1 新建一个kettle项目文件 ktr

涉及按钮:获取文件名,CSV文件输入,Java代码,SQL脚本

组合截图:

5c450768da9a5751fb5726de2c966270.png

获取文件名:

5dd6a3c8842d44df16b09f5ad0ed19d1.png

CSV文件输入控件

a2cf6a512d1af3fc207511c127036b48.png

java代码:后面单独放java代码块:

cce98e55b016afe68481f3198f1f88b7.png

7cbc0778ecc2f826fbb6fd33364443dc.png

注意重写这两个函数:

/*设置参数变量*/

public void setVariable(String variableName, String variableValue) {

parent.setVariableImpl(variableName, variableValue);

}

/*获取参数变量*/

public String getVariable(String variableName) {

return parent.getVariableImpl(variableName);

}

执行SQL脚本:

3b31bfa8c37d05b546247277cf73b09d.png

涉及JAVA代码:

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.Calendar;

/*设置参数变量*/

public void setVariable(String variableName, String variableValue) {

parent.setVariableImpl(variableName, variableValue);

}

/*获取参数变量*/

public String getVariable(String variableName) {

return parent.getVariableImpl(variableName);

}

/**修改参数变量:字段内容,表名*/

public String getTableFields(String field,String tablename){

if( "".equals(field) || field==null || "".equals(tablename)|| tablename==null ){

return null;

}

String[] valueArr = field.split("\\|\\+\\|",-1);//采用 -1模式,不去除末尾的空格

StringBuilder sb = new StringBuilder();

for(int i = 0; i< valueArr.length ;i++){

String value = valueArr[i];

sb.append("`").append(value).append("`,");

}

sb.deleteCharAt(sb.length() -1);

sb.append(",data_date,dw_created_time,dw_created_by,dw_updated_time,dw_updated_by");

return sb.toString(); //

}

/*设置表名或参数*/

public void setSelfVariables(String field,String tablename){

if( "".equals(field) || field==null || "".equals(tablename)|| tablename==null ){

return;

}

/**初始化参数*/

if(getVariable("TABLE_NAME") == null || "".equals(getVariable("TABLE_NAME"))){

setVariable("TABLE_NAME","");

setVariable("TABLE_FIELDS","");

setVariable("ROW_NUMBER","");

};

String tableName=getVariable("TABLE_NAME") ;//获取表名

/**表名不相同,就设置第一行,以及表名*/

if(!tableName.equals(tablename)){

setVariable("TABLE_NAME",tablename);

setVariable("TABLE_FIELDS",getTableFields(field,tablename));

setVariable("ROW_NUMBER","0");

}

else{

int row1=Integer.parseInt(getVariable("ROW_NUMBER")) ;

row1++;

setVariable("ROW_NUMBER",""+row1);

}

}

public boolean processRow(StepMetaInterface smi, StepDataInterface sdi) throws KettleException {

if (first) {

first = false;

}

Object[] r = getRow();

if (r == null) {

setOutputDone();

return false;

}

r = createOutputRow(r, data.outputRowMeta.size());

// Get the value from an input field

String filename = get(Fields.In, "filename").getString(r);

if(filename.contains("/"))

filename=filename.substring(filename.lastIndexOf("/")+1,filename.indexOf("2") -1); //排除Linux环境下的:/tmp/ 反斜杠目录

if(filename.contains("\\"))

filename = filename.substring(filename.lastIndexOf("\\")+1,filename.indexOf("2") -1);//排除windows环境下的D:\ 斜杠目录

String tablename = filename;

tablename=tablename+"_detail";

String field = get(Fields.In,"field").getString(r);

/**如果表名相同,就退出 自定义函数*/

setSelfVariables(field,tablename); //自定义函数

String dataDate=getVariable("DATA_DATE","2019-02-23");// 外界传入参数:data_date 第二个参数为默认值://String getVariable = getVariable(variableName, defaultValue);

String[] valueArr = field.split("\\|\\+\\|",-1);//采用 -1模式,不去除末尾的空格

StringBuilder sb = new StringBuilder();

for(int i = 0; i< valueArr.length ;i++){

String value = valueArr[i];

if(value == null || value.trim().length() == 0){

sb.append("null,");

}else{

sb.append("'");

sb.append(value.replace("'", "\\'"));

sb.append("',");

}

}

sb.deleteCharAt(sb.length() -1);

sb.append(",'"+dataDate+"'");

sb.append(",now(),'同步任务',null,null");

String resultStr = sb.toString();

//logDebug("tableName="+getVariable("TABLE_NAME")+" rowNumber="+ getVariable("ROW_NUMBER")+" resultStr = " + resultStr); //开发打印日志

//logDebug("tableFieldsStr="+getVariable("TABLE_FIELDS"));

get(Fields.Out, "tableName").setValue(r, getVariable("TABLE_NAME"));

get(Fields.Out, "tableFieldsStr").setValue(r, getVariable("TABLE_FIELDS"));

get(Fields.Out, "resultStr").setValue(r, resultStr);

get(Fields.Out, "rowNumber").setValue(r, getVariable("ROW_NUMBER"));

putRow(data.outputRowMeta, r);

return true;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值