Hive 工具类封装解析

符号 阅读:271 2021-03-31 12:44:58 评论:0
package com.zzg.hive.util; 
 
import java.sql.*; 
import java.util.Date; 
import java.util.ArrayList; 
import java.util.List; 
 
/** 
 * 1. 数据仓库连接 
 * 2. 数据库列表预览 
 * 3. 数据表列表预览 
 * 4. 数据表结构预览 
 * 5. 样例数据预览(抽样) 
 * 6. 切换数据库 
 * */ 
 
public class HiveUtil { 
    private Connection conn = null; 
    PreparedStatement preparedStatement = null; 
    ResultSet resultSet = null; 
    Statement statement = null; 
 
    static { 
        try{ 
            //1、加载驱动 
            Class.forName("org.apache.hive.jdbc.HiveDriver"); 
        }catch (ClassNotFoundException e){ 
            e.printStackTrace(); 
        } 
    } 
 
    //构造方法:打开一个连接 
    public HiveUtil(){ 
        try{ 
            //1、数据仓库连接 
            conn = DriverManager.getConnection("jdbc:hive2://master:10010","anna",""); 
            statement = conn.createStatement(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * 2. 数据库列表预览 
     * @return 返回数据库名称集合 
     * 语句:show databases 
     */ 
    public List<String> getDatabases(){ 
        List result = new ArrayList<String>(); 
 
        //执行查询 
        try { 
            preparedStatement = conn.prepareStatement("show databases"); 
            resultSet = preparedStatement.executeQuery(); 
            while (resultSet.next()) { 
                result.add(resultSet.getString(1)); 
            } 
            return result; 
        } catch (SQLException e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
    * 3、数据库列表预览 
    * show tables 
    * @param database 要获取哪个数据库中的表 
    * @return 返回的是数据表的集合 
     * 语句:show {database}.{table} 
    * */ 
    public List<String> getTables(String database){ 
        List result = new ArrayList<String>(); 
 
        //执行查询 
        try { 
            //切换数据库 
            changeDatabase(database); 
            resultSet = statement.executeQuery("show tables"); 
            while (resultSet.next()) { 
                result.add(resultSet.getString(1)); 
            } 
            return result; 
        } catch (SQLException e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
     * 4、 数据表结构预览 
     * @param database 数据库名称 
     * @param table 数据表名称 
     * @return 返回的是表的描述性息的集合 
     * 语句:desc {database}.{table} 
     * */ 
    //需要参数:数据库名,表名 
    public List<String> getTableDesc(String database,String table){ 
        List<String> result = new ArrayList<>(); 
 
       try{ 
           //创建preparedStatement 
           preparedStatement = conn.prepareStatement("desc " + database + "." + table); 
           //执行查询操作 
           ResultSet resultSet = preparedStatement.executeQuery(); 
 
           //将结果封装到list中 
           while (resultSet.next()) { 
               result.add(resultSet.getString(1) + "  " + resultSet.getString(2)); 
           } 
 
           return result; 
 
       } catch (SQLException e) { 
           e.printStackTrace(); 
       } 
       return null; 
    } 
 
    /** 
     * 5. 样例数据预览(抽样)——>limit实现 
     * @param database 数据库名称 
     * @param table 数据表名称 
     * @param n 获取前n行记录 
     * 语句:select * from {database}.{table} limit {number} 
     * */ 
    public List<String> getDataByLimit(String database, String table, int n) { 
        int columns = getTableDesc(database, table).size(); 
        List<String> list = new ArrayList<>(); 
        try { 
            preparedStatement = conn.prepareStatement("select * from " + database + "." + table + " limit " + n); 
            resultSet = preparedStatement.executeQuery(); 
            return getData(resultSet, columns); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
    /** 
     * 5. 样例数据预览(抽样)——> tablesample实现 
     * @param database 数据库名称 
     * @param table 数据表 
     * @param percent 抽样比例 
     * 语句: select * from {database}.{table} tablesample({percent} percent) 
     * */ 
    public List<String> getDataBySample(String database, String table, double percent) { 
        int columns = getTableDesc(database, table).size(); 
        List<String> list = new ArrayList<>(); 
        try { 
            preparedStatement = conn.prepareStatement("select * from " + database + "." + table + " tablesample(" + percent + " percent)"); 
            resultSet = preparedStatement.executeQuery(); 
            return getData(resultSet, columns); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
    /** 
     * 5. 样例数据预览(抽样)——> rand实现 
     * @param database 数据库名称 
     * @param table 数据表 
     * @param n 随机取出前n行记录 
     * 语句:select *,rand()r from {database}.{table} order by r limit n 
     * */ 
    public List<String> getDataByRandom(String database, String table, int n) { 
        int columns = getTableDesc(database, table).size(); 
        List<String> list = new ArrayList<>(); 
        try { 
            preparedStatement = conn.prepareStatement("select *,rand() r from " + database + "." + table + " order by r limit " + n); 
            resultSet = preparedStatement.executeQuery(); 
            return getData(resultSet, columns - 1); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
        return null; 
    } 
 
    /** 
     * 数据封装工具 
     * @param resultSet 结果集 
     * @param size 数据列数量,也就是要获取几列的数据 
     * @return 封装的List数据集 
     */ 
    private List<String> getData(ResultSet resultSet,int size){ 
        try { 
            List<String> list = new ArrayList<>(); 
            while (resultSet.next()) { 
                String line = ""; 
                for (int i = 0; i < size; i++) { 
                    line += resultSet.getString(i + 1) + "\t"; 
                } 
                line = line.substring(0, line.length() - 1);        //左闭右开 
                //将每一条记录添加到lisi中 
                list.add(line); 
            } 
            return list; 
        } catch (Exception e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
     * 通过自定义的SQL返回结果 
     * @param sql 要执行的sql语句——包含数据库名称 
     * @return 执行SQL的结果集 
     * 
     * 前期准备:hive中存在数据库temp,用于存放临时SQL去查询的中间表 
     * ① 将查询到的结果集生成中间表存放到temp数据库下 create table {table} as sql 
     * ② 再通过查询此中间表返回结果集合 
     * ③ 表名随机:tmp_userId_时间戳 
     * */ 
    public List<String> getDataBySQL(String sql) { 
        //将表名进行随机:tmp_userId_时间戳 
        //时间戳——> long ——> 1970-01-01 00:00:00 ——> Unix元年 
 
        try { 
            String tableName = "temp_1_" + new Date().getTime(); 
            preparedStatement = conn.prepareStatement("create table temp." + tableName + " as " + sql); 
            preparedStatement.execute(); 
 
            //获取表的字段个数 
            int size = getTableDesc("temp",tableName).size(); 
            preparedStatement = conn.prepareStatement("select * from temp." + tableName); 
            ResultSet resultSet = preparedStatement.executeQuery(); 
            return getData(resultSet, size); 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
 
        return null; 
    } 
 
 
    /** 
     * 从数据表中查询指定列的数据 
     * @param sql 要执行的sql语句——>包含数据库名称 
     * @param columnsIndex 待查询的列的索引 
     * @return SQL执行的结果集 
     * */ 
    public List<String> getDataBySQLWithColumns(String sql,int[] columnsIndex){ 
        try{ 
            String tableName = "tmp_1_" + new Date().getTime(); 
            preparedStatement = conn.prepareStatement("create table temp." + tableName + " as " + sql); 
            resultSet = preparedStatement.executeQuery(); 
            return getDataByColumns(resultSet, columnsIndex); 
 
        }catch (SQLException e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
     * @param resultSet 查询结果集 
     * @param columnIndex 数据列索引 
     * @return 封装的List数据集 
     * */ 
    private List<String> getDataByColumns(ResultSet resultSet, int[] columnIndex) { 
        List<String> list = new ArrayList<>(); 
 
        try{ 
            while (resultSet.next()) { 
                String line = ""; 
 
                for (int i = 0;i < columnIndex.length;i++) { 
                    line += resultSet.getString(columnIndex[i]) + ","; 
                } 
                line = line.substring(0,line.length() - 1); 
                list.add(line); 
            } 
            return list; 
        } catch (SQLException e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
     * 执行查询语句,返回结果 
     * @param sql 需要执行的sql语句 
     * @param paras 执行查询时所需要的参数 
     * @return 结果集 
     * */ 
    public ResultSet executeQuery(String sql,Object[] paras){ 
        try { 
            preparedStatement = conn.prepareStatement(sql); 
            getPreparedStatement(paras); 
            return preparedStatement.executeQuery(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
            return null; 
        } 
    } 
 
    /** 
     * 将传入的参数进行赋值,构建一个完整的PreparedStatement 
     * @param paras 传入的参数 
     */ 
    private void getPreparedStatement(Object[] paras) { 
        try { 
            if (paras != null) { 
                for (int i = 0; i < paras.length; i++) { 
                    preparedStatement.setObject(i + 1, paras[i]); 
                } 
            } 
        } catch (Exception e) { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * 执行一个不需要返回结果的命令 
     * @param sql 需要执行的sql 
     * @param paras 执行sql需要的参数 
     */ 
    public void execute(String sql, Object[] paras){ 
        try { 
            preparedStatement = conn.prepareStatement(sql); 
            getPreparedStatement(paras); 
            preparedStatement.execute(); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * 6、切换数据库 
     * @param database 数据库名称 
     * 语句:use {database} 
     * */ 
    public void changeDatabase(String database) { 
        try { 
            statement.execute("use " + database); 
        } catch (SQLException e) { 
            e.printStackTrace(); 
        } 
    } 
 
    /** 
     * 释放资源 
     */ 
    public void close() { 
        try { 
            if (resultSet != null) { 
                resultSet.close(); 
            } 
            if (preparedStatement != null){ 
                preparedStatement.close(); 
            } 
            if (conn != null){ 
                conn.close(); 
            } 
        }catch (Exception e){ 
            e.printStackTrace(); 
        } 
    } 
}

 

声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们