在上文中https://www.cnblogs.com/lay2017/p/9973370.html
我们通过hive shell去操作hive,本文我们以Java代码的示例去对hive执行加载数据和查询数据来演示JavaAPI如何通过JDBC来操作hive的
hive client的更多内容可以参考:https://cwiki.apache.org/confluence/display/Hive/HiveClient
一、依赖
由于hive的服务端基于1.2.2版本,所以这里采用jdbc1.2.2,否则你可能报一些奇怪的错误(下载依赖需要一点时间)
<dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.6.5</version> </dependency> <dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.2</version> </dependency>
二、准备
我们在/tmp目录下新建一个user.txt,内容如下:
1 lay 2 marry 3 gary
然后我们启动hdfs,进入hive安装目录:/usr/local/hadoop/hive/apache-hive-1.2.2-bin,启动Hive shell,在test数据库里面新建一张表t_user:
注意,这里建表,指明了格式字段空格分隔,换行' '分隔
CREATE TABLE users(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ' ' LINES TERMINATED BY ' ' STORED AS TEXTFILE;
完毕以后,我们关闭Hive shell,如果你采用derby内置数据库,但是不关闭hive你无法再启动另外一个
我们在hive安装目录,启动hiveserver2,执行命令
hiveserver2
然后你会看到界面被卡住了,其实hive server已经在运行了,如果你打开另一个Linux客户端,你会看到一个runjar的程序在运行
以上,我们启动hiveserver2,准备好了服务端的数据
三、JDBC操作
下面,我们使用jdbc进行操作,代码如下:
hive默认端口是10000,如果你没有配置,并没有通过启动指定的话,默认就是10000;
这里的master是配置过的hostname和ip的映射,如果你直接使用Ip也行。如果你希望配置,可以参考:https://www.cnblogs.com/lay2017/p/9953371.html
驱动采用org.apache.hive.jdbc.HiveDriver,如果你采用org.apache.hadoop.hive.jdbc.HiveDriver会报classNotFound因为,不同版本要求的驱动是不同的,本文基于1.2.2版本,所以要求前者
URL地址采用jdbc:hive2:...而不是jdbc:hive...这是因为我们采用Hiveserver2启动不是hiveserver,如果URL不匹配那么是拿不到connection的
import java.sql.*; public class HiveJdbcDemo { private static String DRIVER = "org.apache.hive.jdbc.HiveDriver"; private static String URL = "jdbc:hive2://master:10000/test"; private static String USERNAME = ""; private static String PASSWORD = ""; private static Connection connection; private static Statement statement; static { try { // 加载hive jdbc驱动 Class.forName(DRIVER); // 获取连接 connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); // 获取statement statement = connection.createStatement(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) throws SQLException { insert(); select(); } public static void insert() throws SQLException { String sql = "load data local inpath '/tmp/user.txt' overwrite into table t_user "; statement.execute(sql); } public static void select() throws SQLException { String sql = "select * from t_user"; ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()) { System.out.println(resultSet.getLong("id"));; System.out.println(resultSet.getString("name"));; } } }
这里的简单代码示例,我们连接了test数据库,然后将/tmp/user.txt文本加载到了数据库中,并通过select语句简单将结果查询了出俩,输出如下:
请注意:如果你输出的都是null,那么可能是因为你在建表的时候没有指明格式,所以加载数据的时候无法按照格式加载进入数据,所以查询自然也就查询出了null。
所以,请确保create table的时候指定的格式,与你的txt文档的格式是一致的。