String sql="show tables; select * from test_tb limit 10";
List<String> command = new ArrayList<String>();
command.add("hive");
command.add("-e");
command.add(sql);
List<String> results = new ArrayList<String>();
ProcessBuilder hiveProcessBuilder = new ProcessBuilder(command);
hiveProcess = hiveProcessBuilder.start();
BufferedReader br = new BufferedReader(new InputStreamReader(
hiveProcess.getInputStream()));
String data = null;
while ((data = br.readLine()) != null) {
results.add(data);
}
其中command可以是其它Hive命令,不一定是HiveQL。
这里所说的在java中执行hive命令或hiveql并不是指hive client通过jdbc的方式连接hiveserver(or hiveserver2)执行查询,而是简单的在部署了hiveserver的服务器上执行hive命令。当然这是一个简单的事情,平常我们通过hive做简单的数据分析实验的时候,都是直接进入hive执行hiveql
? ? ? ?
通过进入hive执行hiveql,只能将分析结果打印到屏幕或是存入临时表,如果想把分析结果写入文件,或者对分析结果做进一步的分析,用程序做分析,就是为什么要在java中执行hive命令。
? ? ? ?
java在1.5过后提供了processbuilder根据运行时环境启动一个process调用执行运行时环境下的命令或应用程序(1.5以前使用runtime),关于processbuilder请参考java相关文档。调用代码如下:
string?sql="show?tables;?select?*?from?test_tb?limit?10";??
list
command.add("hive");??
command.add("-e");??
command.add(sql);??
list
processbuilder?hiveprocessbuilder?=?new?processbuilder(command);??
hiveprocess?=?hiveprocessbuilder.start();??
bufferedreader?br?=?new?bufferedreader(new?inputstreamreader(??
????????hiveprocess.getinputstream()));??
string?data?=?null;??
while?((data?=?br.readline())?!=?null)?{??
????results.add(data);??
}其中command可以是其它hive命令,不一定是hiveql。
java client 中hql执行跟数据库jdbc操作基本相同
1. maven工程依赖hive-jdbc相关jar包,其他工程类型参见maven repsository 相关依赖提示.
<dependency>
<groupId>org.apache.hive</groupId>
<artifactId>hive-jdbc</artifactId>
<version>2.1.0</version>
</dependency>
2. 书写相关代码,如果有链接池配置相关参数就好,注意链接池和hive-jdbc版本问题,过高的链接池版本配置hive-jdbc较低时,在连接校验时会出现unsupport异常.
// 加载驱动
Class.forName("org.apache.hive.jdbc.HiveDriver ");
// connection 为java.sql.Connection
Connection connection = DriverManager.getConnection("jdbc:hive2://locahost:10000/test");
// TODO:后续操作跟数据库jdbc操作一样,不要忘记关闭数据库连接.