第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive

  • 第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive

    • 一、Hive Sql语句补充
    • 二、封装JDBC操作Hive工具类
    • 三、HiveWebInterface - Hive的Web页面接口
      • HWI源码打包配置
      • HWI配置
      • HWI使用
    • 四、JavaWeb结合Hive(一)
      • 注意点
      • 准备工作
      • 编写代码
      • 运行结果

一、Hive Sql语句补充

通过创建中间表来存储查询出的信息

  • use test;

    show tables;

    select * from make limit 10;

    create table t1 as select * from make limit 10;

    select * from t1;

  • create table t2 as

    select floor(p.age/10) as age,sum(o.retail) as sum

    from orders o left join purchaser p

    on o.puechaserId = p.id

    group by floor(p.age/10);

    select * from t2;

二、封装JDBC操作Hive工具类

在HiveJDBC操作Hive的基础上封装工具类

HiveUtil.java

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;public class HiveUtil {private Statement statement = null;public HiveUtil() {open();}static {// 1.加载驱动try {Class.forName("org.apache.hive.jdbc.HiveDriver");} catch (ClassNotFoundException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}private void open() {try {// 2.打开连接Connection connection = DriverManager.getConnection("jdbc:hive2://SZ01:10010/test");// 3.获得操作对象statement = connection.createStatement();} catch (Exception e) {// TODO 自动生成的 catch 块e.printStackTrace();}}/*** 创建数据库 - 用户注册时调用* @param databaseName 根据用户标识生成的数据库名称*/public void createDatabase(String databaseName) {try {statement.execute("create database " + databaseName);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}/*** 切换数据库 - 只对当前会话有效* @param databaseName 目标数据库名称*/public void changeDatabase(String databaseName) {try {statement.execute("use " + databaseName);} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}}/*** 获得当前数据库中的数据列表 - 注意切换数据库* @return 数据表名称的集合*/public List<String> getTableList() {List<String> list = new ArrayList<>();try {ResultSet rs = statement.executeQuery("show tables");while(rs.next()) {list.add(rs.getString(1));}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return list;}/*** 获得数据表的简要信息* @param tableName 数据表名称* @return 列名及列的数据类型*/public List<String> descTable(String tableName){List<String> list = new ArrayList<>();try {ResultSet rs = statement.executeQuery("desc " + tableName);while(rs.next()) {list.add(rs.getString(1) + "\t" + rs.getString(2));}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return list;}/*** 获取数据表前十条的预览数据* @param tableName 数据表名称* @return 数据表预览数据*/public List<String> tableMsg(String tableName){int tableSize = descTable(tableName).size();List<String> list = new ArrayList<>();try {ResultSet rs = statement.executeQuery("select * from "+ tableName +" limit 10");while(rs.next()) {String a = "";for(int i = 1; i <= tableSize; i++) {a += rs.getString(i) + "\t";}list.add(a);}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return list;}/*** 获得查询sql执行后的返回结果* @param sql 用户自定义sql* @return sql执行结果集中的所有数据*/public List<String> getResultData(String sql){List<String> list = new ArrayList<>();// 生成一个对于当前流程唯一的中间表名称// 如果流程会反复执行则先删除该表再创建String tableName = "data_flow";sql = "create table " + tableName + " as " + sql;try {// 执行查询语句,同时使用一个表进行记录statement.execute(sql);// 获得中间表的列信息 - 取决于用户执行sql的结果集结构int tableSize = descTable(tableName).size();ResultSet rs = statement.executeQuery("select * from " + tableName);while(rs.next()) {String a = "";for(int i = 1; i <= tableSize; i++) {a += rs.getString(i) + "\t";}list.add(a);}} catch (SQLException e) {// TODO 自动生成的 catch 块e.printStackTrace();}return list;}
}

HiveUtilTest.java

import java.util.List;import com.cry.hive.util.HiveUtil;public class HiveUtilTest {public static void main(String[] args) {int userId = 1;HiveUtil hiveUtil = new HiveUtil();// 创建库hiveUtil.createDatabase("user" + userId);// 切换库hiveUtil.changeDatabase("test");// 获取当前库中的表列表List<String> tables = hiveUtil.getTableList();for (String table : tables) {System.out.println(table);// 获取表结构信息List<String> columns = hiveUtil.descTable(table);for (String string : columns) {System.out.println(string);}// 获取表内数据信息List<String> tableMsg = hiveUtil.tableMsg(table);for (String string : tableMsg) {System.out.println(string);}System.out.println();}// 执行sql语句并获得返回结果String sql = "SELECT t.typeName,SUM(o.retail) as sum FROM orders o LEFT JOIN type t ON o.typeId = t.id GROUP BY o.typeId,t.typeName";List<String> list = hiveUtil.getResultData(sql);for (String line : list) {System.out.println(line);}}
}

三、HiveWebInterface - Hive的Web页面接口

在Hive架构图中,CLI和JDBC都已经使用过,还有一种操作Hive的方式WebGUI,即hwi

HWI源码打包配置

hwi依赖hive-hwi-1.2.2.war,但是hive安装包目录的lib目录下没有提供,所以需要下载hive的源码包自行打包。

  1. 从apache官网下载apache-hive-1.2.2-src.tar.gz

  2. 通过Xftp将源码包上传至CentOS

  3. 解压缩

    tar -zxvf apache-hive-1.2.2-src.tar.gz

  4. 进入解压缩出来的文件夹中hwi/web目录下

    cd apache-hive-1.2.2-src/hwi/web

  5. 使用命令打包web文件夹

    jar cvfM hive-hwi-1.2.2.war -C web .

  6. 将打包完成的war文件移动至hive安装目录的lib目录下

    mv hive-hwi-1.2.2.war $HIVE_HOME/lib

HWI配置

移动完成后,尝试启动hwi服务,此时启动报错,原因是为在hive-site.xml中没有指定hwi目录

hive –service hwi

此时修改配置文件hive-site.xml,添加以下内容

hive.hwi.war.file

​ lib/hive-hwi-1.2.2.war

注:apache官网中建议配置三项,其中两项默认即可,一是主机0.0.0.0,二是端口号9999,第三项hive.hwi.war.file需指定

再次尝试启动服务

hive –service hwi

发现依旧此时报错,原因是hive缺少jsp依赖

此时可以访问9999端口,但是报错

缺少的jar包可通过Maven下载,点击进入

搜索jasper,下载Jasper Runtime和Jasper Compiler

还缺少commons-el的jar包,一起下载即可

还缺少tools.jar,此jar包在jdk的lib中

总共需要的jar包如下图

将这四个jar包通过Xftp上传至CentOS的$HIVE_HOME/lib目录下

重启hwi服务,即可正常使用

Ctrl + c

hive –service hwi

hive –service hwi命令需要停在当前窗口会话,如果ctrl+c或者关闭会话,服务则无法使用,此时执行以下命令

nohup hive –service hwi > /dev/null 2>&1 &

此命令的含义是开启后台进程并且丢弃nohup.out文件

HWI使用
  • 通过Browse Schema可以浏览库中的信息

  • 通过Create Session创建一个会话,可以执行hql语句

    任务完成后,查看结果

    也可以在指定的文件中查看结果

四、JavaWeb结合Hive(一)

注意点
  1. 在Web中操作Hive,需要给每个用户分配独有的空间,否则容易发生冲突,而且会把数据库内弄得杂乱,不好管理

  2. 用户注册,相当于在HDFS创建相应的目录(MapReduce),在Hive中新建相应的库

  3. 数据库的切换有两种方式:

    (1)打开连接时指定数据库

    (2)使用前切换至相应的数据库下

  4. 数据流管理:数据源在经过多次处理后才能得出最终结果,所以在数据库中需专门建立数据库存放在操作过程中生成的中间表,避免数据库中杂乱无章

准备工作
  • 创建Maven项目,注意需要在pom.xml中配置hadoop、hive、json、jstl等依赖配置
  • 创建普通java项目,则需要手动导入hadoop、hive、json、jstl等等依赖包
  • 导入前文编写的工具类HiveUtil.java
  • 导入jquery
编写代码

目标功能:在页面中显示一个按钮,点击后展示数据库中的所有表

datasource.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title><script type="text/javascript" src="js/jquery-1.7.1.min.js"></script><script type="text/javascript" src="js/datasource.js"></script>
</head>
<body><input class="showTables" type="button" value="显示数据表" /><div class="tableList"></div><div class="tableInfo"></div><div class="tableData"></div>
</body>
</html>

datasource.js

$(function() {$(".showTables").click(function() {var databaseName = "test";$.ajax({url : "DataSourceServlet",type : "post",data : {databaseName : databaseName},dataType : "json",success : function(data) {var content = $(".tableList");for (index in data) {var tableName = data[index];content.append("<div><span>"+ tableName +"</span><input type='button' value='预览数据' /><input type='button' value='结构信息' /></div>");}}})})
})

DataSourceServlet.java

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import com.sand.util.HiveUtil;import net.sf.json.JSONArray;
@WebServlet("/DataSourceServlet")
public class DataSourceServlet extends HttpServlet {private static final long serialVersionUID = 1L;public DataSourceServlet() {super();// TODO Auto-generated constructor stub}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setCharacterEncoding("UTF-8");PrintWriter out = response.getWriter();// 获取数据库名String databaseName = request.getParameter("databaseName");HiveUtil hiveUtil = new HiveUtil();// 通过数据库名切换数据库hiveUtil.changeDatabase(databaseName);// 获得表集合List<String> list = hiveUtil.getTableList();for (String line : list) {System.out.println(line);}// 将结果作为json数组传回到页面String result = JSONArray.fromObject(list).toString();out.print(result);out.close();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}
运行结果

待实现功能:点击预览数据能获得表内的前十条数据,点击结构信息能获得表结构信息,并且都是在当前页面展示

第十三天 - 封装JDBC操作Hive工具类 - HWI配置与使用 - JavaWeb结合Hive相关推荐

  1. 玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53750584 本文出自[DylanAndroid的博客] 玩转JDBC打造数据 ...

  2. 自己封装的poi操作Excel工具类

    在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完成的功能是:读取Excel.汇总Exc ...

  3. ( 持续更新,目前含 200+ 工具类 ) DevUtils 是一个 Android 工具库, 主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。

    DevUtils GitHub About ( 持续更新,目前含 200+ 工具类 ) Roadmap DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 ...

  4. java中文件操作的工具类

    代码: package com.lky.pojo;import java.io.BufferedReader; import java.io.BufferedWriter; import java.i ...

  5. 封装一个邮件发送工具类,一个字,巴适

    系列文章目录 文章目录 系列文章目录 前言 一. 介绍 二.二话不说开始干 1.引入库 2. 邮件发送实体(Mail) 3. 邮件发送类型枚举(MailType ) 4.邮件发送抽象类(Abstrac ...

  6. java操作svn工具类

    依赖包 <dependency><groupId>org.tmatesoft.svnkit</groupId><artifactId>svnkit< ...

  7. 【JDBC】JDBCUtils工具类开发

    [JDBC]JDBCUtils工具类开发 1.JDBCUtils工具类开发 2.使用JdbcUtils工具类测试DML语句 3.使用JdbcUtils工具类测试查询语句 1.JDBCUtils工具类开 ...

  8. Flutter - 一个fultter练习项目(仿写微信UI、实现一些常用效果、封装通用组件和工具类)

    demo 地址: https://github.com/iotjin/jh_flutter_demo 代码不定时更新,请前往github查看最新代码 pwd:123456 代码不定期更新 注:Flut ...

  9. java 操作IP工具类(子网、地址等)

    分享一个操作IP工具类,包含:格式校验,二进制IP互相转换,网段转换,获取网段内IP,校验IP冲突等等 package com.algoblu.pts.boss.basic.utils.ipOpera ...

最新文章

  1. WebView 上传文件 WebChromeClient之openFileChooser函数
  2. 陈怡然团队最新研究:用复数神经网络提高梯度正则化准确度 | ICML 2021
  3. linux安装mysql社区版 rpm_linux系统rpm包安装mysql
  4. bind 0.0.0.0的作用是什么呢?
  5. 程序员成长的10个阶段
  6. android 读写文件 简书,Android10 文件操作适配
  7. mysql解压版怎么添加服务_Windows系统下MySQL添加到系统服务方法(mysql解压版)
  8. AndroidStudio_安卓原生开发_自定义ToastUtils---Android原生开发工作笔记135
  9. kibana报错Request Timeout after 30000ms故障解决
  10. abp后台任务BackGroundWorker
  11. CS229 课程笔记一
  12. 这游戏全服只有一个玩家,硬是坚挺了18年,官方竟还推新版本?
  13. ISP (互联网服务提供商)
  14. WIN10删除微软拼音输入法,设置默认输入法为英文
  15. 多图站点性能优化:图片压缩、图片缩放、HTTP2、CDN、网络传输优化、图片懒加载预加载、响应式图片
  16. Because we are OIer
  17. 互联网广告之精准定向
  18. 加班申请 ----中间表--系统自动算出---可调休天数
  19. DiskGenius稳定不闪退版
  20. excel如何将指定内容移动到指定位置

热门文章

  1. IO流使用available()的大坑
  2. 财务概念整理 入账、结账、销账、挂账、立账etc.
  3. 为什么毕业三四年之后,同学之间的差距会这么大?
  4. uniapp中tabbar设置报错文件查找失败,at mian.js:5
  5. 软件需求管理用例方法 pdf_双全科技|管家婆管理库存必备“序列号”,管家婆软件的使用方法...
  6. 求多个数的最大公约数和最小公倍数,用三种方法实现。
  7. 应用comsol分析多分支缝压裂应力分布
  8. dorado7.x积累
  9. paypal for php,PayPal网站付款标准版(for PHP),paypal标准版_PHP教程
  10. 二叉树非递归遍历(模版)