首页 > 编程语言 >java通过jdbc连接hive并实时获取日志(转)

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

时间:2022-09-01 15:38:07浏览次数:89  
标签:jdbc java String 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,System,hive,state,sql
From: https://www.cnblogs.com/wangbin2188/p/16646668.html

相关文章

  • Java自学网上项目-基于SSH的医院在线挂号
    医院挂号系统主要用于实现医院的挂号,前台基本功能包括:用户注册、用户登录、医院查询、挂号、取消挂号、修改个人信息、退出等。后台基本功能包括:系统管理员登录、医院管理......
  • JavaDOC
    示例代码/***@authorMMF*@version1.0*@since1.8*/publicclassDoc{Stringname;/***@authorMMF*@paramname用户名*......
  • Java流程控制
    1.输出/输入Java提供的输出包括:System.out.println() [换行]/ print() / printf(),其中printf()可以格式化输出;格式化输出使用System.out.printf(),通过使用占位符%?,p......
  • Java集合体系大杂烩
    Java集合体系主要包括Collection和Map两种,Collection存储着对象的集合,而Map存储着键值对(两个对象)的映射表。   下面贴出Map的继承/实现关系。Collection的子......
  • 记一次feign调用报错:feign.codec.DecodeException: Error while extracting response
    一直以为是被调用法的返回对象类型和调用方接收的对象类型不一致导致的解析失败甚至以为无法传递除Jsondate以外的类型 实际问题:多服务调用导出用到多线程token无法......
  • 后端Web开发框架(Java)
    ⬇️点击“下方链接”,提升测试核心竞争力!>>更多技术文章分享和免费资料领取为什么使用SpringBoot简化配置,无需编写太多的xml配置文件,效率很高;Spring可以整合很多各......
  • Java8实战中文版 pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1uuve1acqJl9CdzEPG_JNOg点击这里获取提取码 《Java8实战》Java8的公布使Java编程设计产生了天翻地覆的转变。运用Java......
  • JavaScript高级程序设计(第3版) pdf
    高清扫描版下载链接:https://pan.baidu.com/s/1rWAAzlVrJLfwXEn_SWtBWw点击这里获取提取码JavaScript高级程序设计本书从最早期Netscape浏览器中的JavaScript开始讲起,直到......
  • hive命令数据导入与导出
    数据导入●本地文件导入--本地文件导入(local)LOADDATAlocalINPATH'/home/hadoop/sourceA.txt'INTOTABLEtestAPARTITION(create_time='2015-07-08'); ●H......
  • Java语言基础
    1.Java概述,环境搭建​软件:按照特定顺序组织的计算机数据和指令的集合开发:软件的制作过程软件开发:借助开发⼯具与计算机语⾔制作软件代码:代替编码的符号代替编码......