概述
在日常数据开发过程中,会经常需要根据数据模型写建表语句,或者在表数据探索时写查询语句,每次写建表语句都会用几分钟的时间,于是打算做个excel模板,把表字段、表分区、表名写在里面,通过程序自动生成建表语句、查询语句。
我的上传资源有打包好的程序,如果嫌麻烦可以直接下载使用。链接:https://download.csdn.net/download/tanhaidi/12058208
下面说一下具体步骤:
(1)定制excel模板
A到C列是字段名,D到F列是分区列,H1是表英文名,H2是表中文名。
文档另存为Excel97-2003工作簿,因为java中使用了jx.jar包,对excel版本有限制。
(2)编写生成语句脚本,java版本1.7
附上代码:
package cn.com.tanhaidi;
import java.io.File;
import java.io.PrintWriter;
import jxl.Sheet;
import jxl.Workbook;
public class CreateHiveTableDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
// File file = new File("D:\javaworkspace\project1\src\abcd.xls");
File file = new File("./建表语句模板.xls");
Workbook wb = Workbook.getWorkbook(file);
Sheet sheet = wb.getSheet(0);
String createstr = createstatement(sheet) ;
String selectstr = selectstatement(sheet) ;
String result = createstr + selectstr ;
System.out.println(result);
// PrintWriter writer = new PrintWriter("D:\javaworkspace\project1\src\result.txt") ;
// PrintWriter writer = new PrintWriter(new File("/javaworkspace/result.txt").getAbsolutePath()) ;
PrintWriter writer = new PrintWriter("./result.sql") ;
writer.write(result);
writer.close();
// System.out.println(new File("a").getAbsolutePath().toString());
}
// 生成建表语句的方法
public static String createstatement(Sheet sheet){
StringBuffer bodysb = new StringBuffer(); // 建表语句的表头
StringBuffer fldsb = new StringBuffer(); // 字段部分
StringBuffer commentsb = new StringBuffer(); // 表中文名
StringBuffer partitionsb = new StringBuffer(); // 分区字段部分
bodysb.append("建表语句: rnrncreate table ");
partitionsb.append("partitioned by (rn") ;
bodysb.append(sheet.getCell(7, 0).getContents());
// 表头部分
bodysb.append(" (rn");
// System.out.println(bodysb);
// 表中文名
commentsb.append("rncomment '" + sheet.getCell(7, 1).getContents() + "'rn");
// 字段部分
for (int i = 1; i < sheet.getRows(); i++) {
// 首行处理
if (i == 1) {
fldsb.append(" " + sheet.getCell(0, 1).getContents() + " " + sheet.getCell(1, 1).getContents() + " comment '" + sheet.getCell(2, 1).getContents()
+ "'rn");
} else if (i > 1 && i < sheet.getRows() - 1) {
for (int j = 0; j <= 2; j++) {
switch (j) {
case 0:
fldsb.append("," + sheet.getCell(j, i).getContents());
break;
case 1:
fldsb.append(" " + sheet.getCell(j, i).getContents() + " comment '");
break;
case 2:
fldsb.append(sheet.getCell(j, i).getContents() + "'rn");
break;
default:
break;
}
}
} else {
fldsb.append("," + sheet.getCell(0,sheet.getRows()-1).getContents() +" "+sheet.getCell(1,sheet.getRows()-1).getContents() + " comment '"+sheet.getCell(2,sheet.getRows()-1).getContents()+"'rn)");
}
}
//分区部分
for (int i = 1; i < sheet.getRows() ; i++) {
// 首行处理
if (i == 1 && !sheet.getCell(3, 1).getContents().isEmpty()) {
partitionsb.append(" " + sheet.getCell(3, 1).getContents() + " " + sheet.getCell(4, 1).getContents() + " comment '" + sheet.getCell(5, 1).getContents()
+ "'rn");
} else if (i > 1 && i < sheet.getRows() - 1) {
for (int j = 3; j <= 5 && !sheet.getCell(j,i).getContents().isEmpty() ; j++) {
if(!sheet.getCell(3, 1).getContents().isEmpty()){
switch (j) {
case 3:
partitionsb.append("," + sheet.getCell(j, i).getContents());
break;
case 4:
partitionsb.append(" " + sheet.getCell(j, i).getContents() + " comment '");
break;
case 5:
partitionsb.append(sheet.getCell(j, i).getContents() + "'rn");
break;
default:
break;
}
}
}
} else {
partitionsb.append(")rnrn");
}
}
// 合并结果集
StringBuffer result = new StringBuffer() ;
result = bodysb.append(fldsb).append(commentsb).append(partitionsb) ;
return result.toString() ;
}
// 生成查询语句脚本
public static String selectstatement(Sheet sheet){
StringBuffer bodysb = new StringBuffer(); // 查询语句的表头
StringBuffer fldsb = new StringBuffer(); // 字段部分
StringBuffer fromsb = new StringBuffer(); // from部分
bodysb.append("查询语句: rnrnSELECTrn ");
fromsb.append("FROM "+sheet.getCell(7, 0).getContents() + " -- "+sheet.getCell(7, 1).getContents() + "rn") ;
// 字段部分
for (int i = 1; i < sheet.getRows(); i++) {
// 首行处理
if (i == 1) {
fldsb.append(" " + sheet.getCell(0, 1).getContents() + " -- " + sheet.getCell(2, 1).getContents()
+ "rn");
} else if (i > 1 && i < sheet.getRows() ) {
for (int j = 0; j <= 2 && !sheet.getCell(j, i).getContents().isEmpty(); j++) {
switch (j) {
case 0:
fldsb.append(", " + sheet.getCell(j, i).getContents());
break;
case 1:
fldsb.append(" -- ");
break;
case 2:
fldsb.append(sheet.getCell(j, i).getContents() + "rn");
break;
default:
break;
}
}
} else {
}
}
String result = bodysb.toString()+fldsb.toString()+fromsb.toString();
return result;
}
}
代码说明: 相对路径:读文件("./建表语句模板.xls")和写文件都使用了相对路径,表示放在跟目录下,就是你的java项目的文件的下面。
jxl.jar包是从网上下载的,可以在我的上传中找到,链接https://download.csdn.net/download/tanhaidi/12058019
(3)jar包导出
点击finish
(4) 下载exe4j_windows-x64_6_0_1
官网下载即可。
安装过程无脑下一步即可。
Main Class From : org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
这个写死即可,之前写自己程序的类所在路径,报错:找不到jxl类,后来网上找的解决方法,即这里写上这个参数。
点击Compile executable,小程序就生成完了。
最后
以上就是心灵美冬日为你收集整理的excel模板利用java自动生成hive建表语句、查询语句小程序的全部内容,希望文章能够帮你解决excel模板利用java自动生成hive建表语句、查询语句小程序所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复