HiveJDBC详细解析

发布时间:2023-05-20

一、hivejdbc下载

HiveJDBC是实现Hive与JDBC的接口,可以方便地连接Hive并执行SQL语句。在使用HiveJDBC前,需要先下载对应版本的JDBC驱动程序,可以从Hive官网上下载。比如,下载版本为3.1.0的HiveJDBC驱动程序:

curl -LO https://repo1.maven.org/maven2/org/apache/hive/hive-jdbc/3.1.0/hive-jdbc-3.1.0-standalone.jar

二、hivejdbc连接默认超时

HiveJDBC连接默认超时时间为30秒,如果连接超时,则会抛出TTransportException异常。可以通过以下方法设置连接超时时间:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class HiveJdbcExample {
  public static void main(String[] args) throws SQLException {
    //连接字符串
    String url = "jdbc:hive2://<host>:<port>/<database>";
    Properties props = new Properties();
    //设置连接超时时间为60秒
    props.setProperty("hs2.connection.timeout", "60");
    //获取连接
    Connection conn = DriverManager.getConnection(url, props);
  }
}

三、hivejdbc超时不断开

默认情况下,HiveJDBC连接超时后会断开连接,可以通过以下方法设置超时后不断开连接:

//设置超时后不断开连接
props.setProperty("hs2.server.no.retries", "true");

四、jdbc连接

HiveJDBC实现了JDBC接口,可以通过JDBC方式连接Hive,并执行SQL语句。以下是连接示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class HiveJdbcExample {
  public static void main(String[] args) throws SQLException {
    //连接字符串
    String url = "jdbc:hive2://<host>:<port>/<database>";
    //获取连接
    Connection conn = DriverManager.getConnection(url);
  }
}

五、hivejdbc长时间获取不到连接

使用HiveJDBC连接池时,如果长时间获取不到连接,则会抛出SQLException异常。可以通过以下方法设置连接池配置信息:

import org.apache.commons.dbcp2.BasicDataSource;
public class HiveJdbcExample {
  public static void main(String[] args) throws SQLException {
    //连接池对象
    BasicDataSource ds = new BasicDataSource();
    //设置HiveJDBC连接URL
    ds.setUrl("jdbc:hive2://<host>:<port>/<database>");
    //设置连接用户名
    ds.setUsername("<username>");
    //设置连接密码
    ds.setPassword("<password>");
    //设置最大连接数
    ds.setMaxTotal(50);
    //获取连接
    Connection conn = ds.getConnection();
  }
}

六、hivejdbctemplate

HiveJdbcTemplate是Spring Framework提供的JDBC模板类,可以方便地执行Hive SQL语句。使用HiveJdbcTemplate,不需要手动创建连接,只需要配置数据源即可。

七、hivejdbctemplate 大小写

HiveJdbcTemplate默认执行SQL语句时,不区分大小写。如果需要区分大小写,可以通过以下方法设置:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
public class HiveJdbcTemplateExample {
  public static void main(String[] args) {
    //数据源
    DriverManagerDataSource dataSource = new DriverManagerDataSource();
    dataSource.setDriverClassName("org.apache.hive.jdbc.HiveDriver");
    dataSource.setUrl("jdbc:hive2://<host>:<port>/<database>");
    dataSource.setUsername("<username>");
    dataSource.setPassword("<password>");
    //JdbcTemplate
    JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
    jdbcTemplate.setIgnoreCase(false); //设置为区分大小写
  }
}

八、hivejdbc 查spark报错

当Hive与Spark集成时,可能会出现HiveJDBC执行SQL报错的情况,此时需要设置Spark配置项。可以通过以下方法启用Spark集成:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class HiveJdbcExample {
  public static void main(String[] args) throws SQLException {
    //连接字符串
    String url = "jdbc:hive2://<host>:<port>/<database>;transportMode=http";
    Properties props = new Properties();
    //设置Spark Master URL
    props.setProperty("spark.master", "spark://<spark_host>:<spark_port>");
    //获取连接
    Connection conn = DriverManager.getConnection(url, props);
  }
}

九、hivejdbc执行sql长时间不返回结果

当Hive执行SQL语句时,可能需要较长时间才能返回结果,此时可以设置HiveJDBC连接的Socket超时时间,可以通过以下方法设置:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
public class HiveJdbcExample {
  public static void main(String[] args) throws SQLException {
    //连接字符串
    String url = "jdbc:hive2://<host>:<port>/<database>";
    Properties props = new Properties();
    //设置Socket超时时间为5分钟
    props.setProperty("hive.server2.long.polling.timeout", "300000");
    //获取连接
    Connection conn = DriverManager.getConnection(url, props);
  }
}

十、hivejdbcdriver 500051

当使用HiveJDBC执行SQL语句时,可能会出现错误码为500051的异常,该异常是由于Hive返回的数据过大,超出了HiveJDBC的缓存空间。可以通过以下方法设置HiveJDBC的缓存空间大小:

import org.apache.hadoop.hive.conf.HiveConf;
public class HiveJdbcExample {
  public static void main(String[] args) {
    //HiveConf对象
    HiveConf conf = new HiveConf();
    //设置结果集缓存大小为1GB
    conf.setVar(HiveConf.ConfVars.HIVE_RESULTSET_MAX_CACHE_SIZE, "1000000000");
  }
}