zoukankan      html  css  js  c++  java
  • 用Java代码通过JDBC连接Hiveserver2

    1.在终端启动hiveserver2
    #hiveserver2

    2.使用beeline连接hive
    另外打开一个终端,输入如下命令(xavierdb必须是已经存在的数据库)
    #beeline -u jdbc:hive2://localhost:10000/xavierdb -n hive -p hive

    3.添加maven依赖

    <!-- https://mvnrepository.com/artifact/org.apache.hadoop.hive/hive-jdbc -->
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-jdbc</artifactId>
                <version>1.1.0</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-common</artifactId>
                <version>2.6.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hadoop/hadoop-client -->
            <dependency>
                <groupId>org.apache.hadoop</groupId>
                <artifactId>hadoop-client</artifactId>
                <version>2.6.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore -->
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-metastore</artifactId>
                <version>1.1.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.apache.hive/hive-metastore -->
            <dependency>
                <groupId>org.apache.hive</groupId>
                <artifactId>hive-exec</artifactId>
                <version>1.1.0</version>
            </dependency>
    maven依赖

    出现过的错误: Error: Could not open client transport with JDBC Uri: jdbc:hive2://localhost:10000/default

    解决办法:检查发现运行beeline时Driver版本Driver: Hive JDBC (version 1.1.0-cdh5.16.1)比maven依赖中的Driver版本低,将maven版本调至1.1.0问题解决

    Java API测试:

    注意:这里的url必须是beeline值中使用的url

    
    
    package TestOption;


    import org.junit.Test;
    import org.junit.After;
    import org.junit.Before;

    import java.sql.*;

    /**
    * @Author:Xavier
    * @Data:2019-02-18 11:43
    **/


    public class HiveOption {

    private static String driverName = "org.apache.hive.jdbc.HiveDriver";
    private static String url = "jdbc:hive2://yourhost:10000/yourdatabase";

    private static Connection con = null;
    private static Statement state = null;
    private static ResultSet res = null;

    //加载驱动,创建连接
    @Before
    public void init() throws ClassNotFoundException, SQLException {
    Class.forName(driverName);
    con = DriverManager.getConnection(url, "hive", "hive");
    state = con.createStatement();
    }

    //创建数据库
    @Test
    public void CreateDb() throws SQLException {

    state.execute("create database xavierdb1");

    }

    // 查询所有数据库
    @Test
    public void showtDb() throws SQLException {
    res = state.executeQuery("show databases");
    while (res.next()) {
    System.out.println(res.getString(1));
    }
    }

    // 删除数据库
    @Test
    public void dropDb() throws SQLException {
    state.execute("drop database if exists xavierdb1");
    }


    /*
    *
    *
    * 内部表基本操作
    *
    *
    * */

    // 创建表
    @Test
    public void createTab() throws SQLException {

    state.execute("create table if not exists student ( " +
    "name string , " +
    "age int , " +
    "agent string ," +
    "adress struct<street:STRING,city:STRING>) " +
    "row format delimited " +
    "fields terminated by ',' " +//字段与字段之间的分隔符
    "collection items terminated by ':'" +//一个字段各个item的分隔符
    "lines terminated by ' ' ");//行分隔符
    }

    // 查询所有表
    @Test
    public void showTab() throws SQLException {
    res = state.executeQuery("show tables");
    while (res.next()) {
    System.out.println(res.getString(1));
    }
    }

    // 查看表结构
    @Test
    public void descTab() throws SQLException {
    res = state.executeQuery("desc emp");
    while (res.next()) {
    System.out.println(res.getString(1) + " " + res.getString(2));
    }
    }

    // 加载数据
    @Test
    public void loadData() throws SQLException {
    String infile = " '/root/studentData' ";
    state.execute("load data local inpath " + infile + "overwrite into table student");
    }

    // 查询数据
    @Test
    public void selectTab() throws SQLException {
    res = state.executeQuery("select * from student1");
    while (res.next()) {
    System.out.println(
    res.getString(1) + "-" +
    res.getString(2) + "-" +
    res.getString(3) + "-" +
    res.getString(4));
    }
    }

    // 统计查询(会运行mapreduce作业,资源开销较大)
    @Test
    public void countData() throws SQLException {
    res = state.executeQuery("select count(1) from student");
    while (res.next()) {
    System.out.println(res.getInt(1));
    }
    }

    // 删除表
    @Test
    public void dropTab() throws SQLException {
    state.execute("drop table emp");
    }


    /*
    * 外部表基本操作
    *
    *外部表删除后,hdfs文件系统上的数据还在,
    *重新创建同路径外部表后,其数据仍然存在
    *
    * */

    //创建外部表
    @Test
    public void createExTab() throws SQLException {

    state.execute("create external table if not exists student1 ( " +
    "name string , " +
    "age int , " +
    "agent string ," +
    "adress struct<street:STRING,city:STRING>) " +
    "row format delimited " +
    "fields terminated by ',' " +
    "collection items terminated by ':'" +
    "lines terminated by ' ' " +
    "stored as textfile " +
    "location '/testData/hive/student1' ");//不指定路径时默认使用hive.metastore.warehouse.dir指定的路径
    }

    //从一张已经存在的表上复制其表结构,并不会复制其数据
    //
    //创建表,携带数据
    //create table student1 as select * from student
    //创建表,携带表结构
    //create table student1 like student
    //
    @Test
    public void copyExTab() throws SQLException {
    state.execute("create external table if not exists student2 " +
    "like xavierdb.student " +
    "location '/testData/hive/student1'");
    }


    /*
    * 分区表
    *
    * 必须在表定义时创建partition
    *
    *
    * */

    //静态分区


    //创建分区格式表
    @Test
    public void creatPartab() throws SQLException {
    state.execute("create table if not exists emp (" +
    "name string ," +
    "salary int ," +
    "subordinate array<string> ," +
    "deductions map<string,float> ," +
    "address struct<street:string,city:string>) " +
    "partitioned by (city string,street string) " +
    "row format delimited " +
    "fields terminated by ' ' " +
    "collection items terminated by ',' " +
    "map keys terminated by ':' " +
    "lines terminated by ' ' " +
    "stored as textfile");
    }

    //添加分区表
    @Test
    public void addPartition() throws SQLException {
    state.execute("alter table emp add partition(city='shanghai',street='jinkelu') ");
    }

    //查看分区表信息
    @Test
    public void showPartition() throws SQLException {
    // res=state.executeQuery("select * from emp");
    res = state.executeQuery("show partitions emp");
    while (res.next()) {
    System.out.println(res.getString(1));
    }
    }

    //插入数据
    @Test
    public void loadParData() throws SQLException {
    String filepath = " '/root/emp' ";
    state.execute("load data local inpath " + filepath + " overwrite into table emp partition (city='shanghai',street='jinkelu')");
    }

    //删除分区表
    @Test
    public void dropPartition() throws SQLException {
    state.execute("alter table employees drop partition (city='shanghai',street='jinkelu') ");
    /*
    *
    * 1,把一个分区打包成一个har
    alter table emp archive partition (city='shanghai',street='jinkelu')
    2, 把一个分区har包还原成原来的分区
    ` alter table emp unarchive partition (city='shanghai',street='jinkelu')
    3, 保护分区防止被删除
    alter table emp partition (city='shanghai',street='jinkelu') enable no_drop
    4,保护分区防止被查询
    alter table emp partition (city='shanghai',street='jinkelu') enable offline
    5,允许分区删除和查询
    alter table emp partition (city='shanghai',street='jinkelu') disable no_drop
    alter table emp partition (city='shanghai',street='jinkelu') disable offline
    * */
    }
    //外部表同样可以使用分区


    //动态分区
    //
    //当需要一次插入多个分区的数据时,可以使用动态分区,根据查询得到的数据动态分配到分区里。
    // 动态分区与静态分区的区别就是不指定分区目录,由hive根据实际的数据选择插入到哪一个分区。
    //
    //set hive.exec.dynamic.partition=true; 启动动态分区功能
    //set hive.exec.dynamic.partition.mode=nonstrict 分区模式,默认nostrict
    //set hive.exec.max.dynamic.partitions=1000 最大动态分区数,默认1000

    //创建分区格式表
    @Test
    public void creatPartab1() throws SQLException {
    state.execute("create table if not exists emp1 (" +
    "name string ," +
    "salary int ," +
    "subordinate array<string> ," +
    "deductions map<string,float> ," +
    "address struct<street:string,city:string>) " +
    "partitioned by (city string,street string) " +
    "row format delimited " +
    "fields terminated by ' ' " +
    "collection items terminated by ',' " +
    "map keys terminated by ':' " +
    "lines terminated by ' ' " +
    "stored as textfile");
    }

    //靠查询到的数据来分区
    @Test
    public void loadPartitionData() throws SQLException {
    state.execute("insert overwrite table emp1 partition (city='shanghai',street) " +
    "select name,salary,subordinate,deductions,address,address.street from emp");
    }


    // 释放资源
    @After
    public void destory() throws SQLException {
    if (res != null) state.close();
    if (state != null) state.close();
    if (con != null) con.close();
    }
    }
     

    ***连接HiveServer2修改hive配置的方法***

    1)、直接在URL中添加

    ...
    url = "jdbc:hive2://yourhost:10000/yourdatabase?mapreduce.job.queuename=root.hive-server2;hive.execution.enginer=spark";
    Connection con = DriverManager.getConnection(url,  "hive", "hive");
    ...

    多个conf配置之间使用" ; "  分割开;conf配置内容和url 变量内容使用" # "分割开

    2)、使用state.execute 直接执行set 操作

    ...
    state.execute("set hive.execution.engine=spark");
    ...

    3 )、通过连接属性设置

    Class.forName("org.apache.hive.jdbc.HiveDriver");
    Properties propertie = new Properties();
    propertie.setProperty("user", "hive");
    propertie.setProperty("password", "hive");
    // 这里传递了一个队列的hive_conf
    propertie.setProperty("hive.execution.engine", "spark");
    String url="jdbc:hive2://yourhost:10000/yourdatabase";
    Connection conn = DriverManager.getConnection(url, propertie);
    HiveStatement stat = (HiveStatement) conn.createStatement();
  • 相关阅读:
    【FFT】BZOJ2179- FFT快速傅立叶
    【2-SAT(tarjan)】BZOJ1997-[Hnoi2010]Planar
    【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子
    【序列莫队】BZOJ2038- [2009国家集训队]小Z的袜子(hose)
    【高斯消元解xor方程】BZOJ1923-[Sdoi2010]外星千足虫
    【高斯消元解xor方程组】BZOJ2466-[中山市选2009]树
    【高斯消元】BZOJ1013-[JSOI2008]球形空间产生器sphere
    【欧拉函数】BZOJ2818-GCD
    守望者的逃离
    传球游戏
  • 原文地址:https://www.cnblogs.com/xavier-xd/p/10399581.html
Copyright © 2011-2022 走看看