我是靠谱客的博主 心灵美冬日,最近开发中收集的这篇文章主要介绍excel模板利用java自动生成hive建表语句、查询语句小程序,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在日常数据开发过程中,会经常需要根据数据模型写建表语句,或者在表数据探索时写查询语句,每次写建表语句都会用几分钟的时间,于是打算做个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建表语句、查询语句小程序所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部