Java API操作Hive

本文介绍如何启动HiveServer2并使用Java API进行Hive操作,包括创建和删除表等基本功能。提供了完整的代码示例及验证方法。

官网地址
https://cwiki.apache.org/confluence/display/Hive/HiveServer2+Clients#HiveServer2Clients-JDBC

一、启动hiveserver2
使用Java API操作hive之前必须启动hiveserver2(服务都没起,客户端怎么可能访问的到呢?)

启动命令

[root@hadoop001 bin]# hiveserver2 &
[1] 7495
[root@hadoop001 bin]# which: no hbase in (/bin:/opt/app/sqoop-1.4.6-cdh5.7.0/bin:/opt/app/hive-1.1.0-cdh5.7.0/bin:/bin:/opt/app/2.6.0-cdh5.7.0/bin:/opt/app/2.6.0-cdh5.7.0/sbin:/bin:/opt/software/findbugs-1.3.9/bin:/usr/local/protobuf/bin:/opt/software/maven-3.3.9/bin:/usr/java/jdk1.8/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)

客户端操作hive的结果会在这个界面打印出来(操作成功会显示ok,失败会有失败的一些信息)

二、IDEA构建Java API

package com.ruozedata.hive;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class HiveJDBC {
    public static  String driveName="org.apache.hive.jdbc.HiveDriver";
    public static  String url="jdbc:hive2://192.168.187.111:10000/default";
    public static  String username="root";
    public static  String password="";

    public static void main(String[] args) throws Exception {
        Class.forName(driveName);
        Connection con=DriverManager.getConnection(url,username,password);
         Statement stms=con.createStatement();
        String tableName = "testHiveDriverTable";
        stms.execute("drop table if exists " + tableName);
        stms.execute("create table " + tableName + " (key int, value string)");
        // show tables
        String sql = "show tables '" + tableName + "'";
        System.out.println("Running: " + sql);
        ResultSet res = stms.executeQuery(sql);
        if (res.next()) {
            System.out.println(res.getString(1));
        }

    }
}

以上API是在Hive当中创建一张testHiveDriverTable表,至于删除表之类,大家可以参考官网。

三、验证
可以看到testhivedrivertable表已创建成功

hive (default)> show tables;
OK
tab_name
emp
emp_external
testhivedrivertable
Time taken: 0.989 seconds, Fetched: 3 row(s)

server端会给出最后操作的结果(OK)

[root@hadoop001 bin]# hiveserver2 &
[1] 7495
[root@hadoop001 bin]# which: no hbase in (/bin:/opt/app/sqoop-1.4.6-cdh5.7.0/bin:/opt/app/hive-1.1.0-cdh5.7.0/bin:/bin:/opt/app/2.6.0-cdh5.7.0/bin:/opt/app/2.6.0-cdh5.7.0/sbin:/bin:/opt/software/findbugs-1.3.9/bin:/usr/local/protobuf/bin:/opt/software/maven-3.3.9/bin:/usr/java/jdk1.8/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)
OK
OK
OK
以下是使用 Java APIHive 表进行创建表、插入数据和查询数据操作的实现方法: ### 创建表 以下代码展示了如何使用 Java APIHive 中创建表,使用了 `HiveTemplate` ,需要在 Spring 框架中使用: ```java import javax.annotation.Resource; import org.springframework.web.bind.annotation.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.druid.support.spring.stat.annotation.Stat; import org.springframework.jdbc.core.JdbcTemplate; @Controller public class UserContronller { @Resource private HiveTemplate hiveTemplate; @RequestMapping("/createTable") @ResponseBody public void create() { StringBuilder sql = new StringBuilder("set mapred.queue.names=queue1;"); sql.append("create table user (id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;"); hiveTemplate.query(sql.toString()); } } ``` 上述代码通过 `HiveTemplate` 执行创建表的 SQL 语句,在创建表之前设置了队列名称,然后创建了一个名为 `user` 的表,表中有 `id` 和 `name` 两个字段,字段之间用逗号分隔 [^1]。 ### 插入数据 以下是插入数据的示例代码,同样使用 `HiveTemplate`: ```java import javax.annotation.Resource; import org.springframework.web.bind.annotation.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.druid.support.spring.stat.annotation.Stat; import org.springframework.jdbc.core.JdbcTemplate; @Controller public class InsertDataController { @Resource private HiveTemplate hiveTemplate; @RequestMapping("/insertData") @ResponseBody public void insert() { String insertSql = "INSERT INTO TABLE user VALUES (1, 'John')"; hiveTemplate.update(insertSql); } } ``` 此代码使用 `HiveTemplate` 的 `update` 方法执行插入数据的 SQL 语句,向 `user` 表中插入了一条数据。 ### 查询数据 以下是查询数据的示例代码: ```java import javax.annotation.Resource; import org.springframework.web.bind.annotation.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.druid.support.spring.stat.annotation.Stat; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; import java.util.Map; @Controller public class QueryDataController { @Resource private HiveTemplate hiveTemplate; @RequestMapping("/queryData") @ResponseBody public List<Map<String, Object>> query() { String querySql = "SELECT * FROM user"; return hiveTemplate.queryForList(querySql); } } ``` 该代码使用 `HiveTemplate` 的 `queryForList` 方法执行查询 SQL 语句,将查询结果以 `List<Map<String, Object>>` 的形式返回。 ### 注意事项 在使用 Java API 操作 Hive 时,默认开启 10000 端口,开启前需要编辑 `hive-site.xml` 设置 `impersonation`,防止 hdfs 权限问题。可以通过以下配置设置: ```xml <property> <name>hive.server2.enable.doAs</name> <value>false</value> </property> ``` 这样 Hive Server 会以提交用户的身份去执行语句,如果设置为 `false`,则会以启动 Hive Server Daemon 的 `admin user` 来执行语句 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值