ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java通过jdbc连接hive并实时获取日志(转)

2022-09-01 15:31:06  阅读:254  来源: 互联网

标签:jdbc java String res System hive state sql


转载:https://blog.csdn.net/weixin_43455443/article/details/115343995

4、通过java代码连接hive on spark,使用hive-jdbc
引入pom文件

<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.1</version>
</dependency>

 

 

import java.sql.*;
import java.util.Scanner;

public class HiveJDBC {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
        String driverName = "org.apache.hive.jdbc.HiveDriver";
        String url = "jdbc:hive2://hadoop162:10000";
        String dbName = "default";
        Connection con = null;
        Statement state = null;
        ResultSet res = null;

        Class.forName(driverName);
        //这里必须指定用户名和密码,密码可以为空字符串,如果不指定则或报错启动sparksession失败
        con= DriverManager.getConnection(url+"/"+dbName,"hive","");
        state = con.createStatement();
        Scanner scan = new Scanner(System.in);
        String sql=null;
        //创建临时udf,可以不创建
        state.execute("create temporary function pinjie as 'com.topnet.MyUDF' using jar 'hdfs:///user/hive/udf/hiveUDF-1.0.jar'");
        while (true){
            System.out.println("亲输入sql:");
            if(scan.hasNext()){
                sql=scan.nextLine();
            }
            System.out.println(sql);
            res = state.executeQuery(sql);
            while (res.next()) {
                System.out.println(res.getString(1));
            }
            Thread.sleep(100);
        }
    }
}

 



5、运行sql的执行日志获取
使用hive-jdbc运行时,如果想获取sql的执行日志,则可以通过这几个方法获取运行的日志信息。List<String> getQueryLog(),List<String> getQueryLog(boolean incremental, int fetchSize)和boolean hasMoreLogs()三个方法,在进行hive的sql查询时,有时一个sql可能需要运行很长时间,借助这三个方法,还可以实时显示sql 的查询进度。

想要实时的显示sql查询进度,则需要再开启一个线程进行日志获取打印。

 

public class HiveJDBC {
    public static void main(String[] args) throws ClassNotFoundException, SQLException, InterruptedException {
        Logger log = LoggerFactory.getLogger(HiveJDBC.class);
        String driverName = "org.apache.hive.jdbc.HiveDriver";
        String url = "jdbc:hive2://hadoop162:10000";
        String dbName = "default";
        Connection con = null;
        Statement state = null;
        ResultSet res = null;

        Class.forName(driverName);
        //这里必须指定用户名和密码,密码可以为空字符串,如果不指定则或报错启动sparksession失败
        con = DriverManager.getConnection(url + "/" + dbName, "hive", "");
        state = con.createStatement();
        Scanner scan = new Scanner(System.in);
        String sql = null;
        
        //开启线程获取sql执行日志
        Thread logThread = new Thread(new HiveLog((HiveStatement) state));
        logThread.setDaemon(true);
        logThread.start();

        //注册临时udf函数,可以不创建
        state.execute("create temporary function pinjie as 'com.topnet.MyUDF' using jar 'hdfs:///user/hive/udf/hiveUDF-1.0.jar'");
        while (true) {
            System.out.println("亲输入sql:");
            if (scan.hasNext()) {
                sql = scan.nextLine();
            }
            log.error("打印日志sql语句:" + sql);
            res = state.executeQuery(sql);
            while (res.next()) {
                System.out.println(res.getString(1));
            }
            Thread.sleep(100);
        }
    }

    static class HiveLog extends Thread {
        private final HiveStatement state;

        HiveLog(HiveStatement state) {
            this.state = state;
        }
        
        private void updateQueryLog() {
            try {
                List<String> queryLogs = state.getQueryLog();
                for (String log : queryLogs) {
                    System.out.println("进度信息-->" + log);
                }
            } catch (Exception e) {
            }
        }
        
        @Override
        public void run() {
            try {
                //循环不断的获取sql执行的日志
                while (true) {
                    if (state.hasMoreLogs()) {
                        updateQueryLog();
                    }
                    Thread.sleep(100);
                }
            } catch (InterruptedException e) {
                e.getStackTrace();
            }
        }
    }
}

 

标签:jdbc,java,String,res,System,hive,state,sql
来源: https://www.cnblogs.com/wangbin2188/p/16646668.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有