前两天,因为系统的架构设计的缘由,想经过Java直接访问Hive数据库,对于我这个Java以及Hadoop平台的菜鸟来讲,的确是困难重重,不过,还好是搞定了。感受也不是很麻烦。这篇文章,做为一个感想记录下来。( 做者:yangyang8848)css
1、Hive的访问方式java
通常状况下,Hive是不能直接Java链接并访问的,后来出现来一个SparkSQL的东东,变得能够经过JDBC的方式访问链接。首先,我先介绍一些从Linux下访问的方法:sql
一、远程登陆到Linux平台:数据库
二、进入到hive数据库中,咱们执行一条查询语句:apache
经过上图能够看到,系统执行了Map/Reduce操做,并最后显示相关的结果。服务器
这里有一个干货哦:Hive查询语句不支持相似于Mysql中的分页查询的,所以,这里采用了另一种办法进行分页,本身看图片学习啦~!架构
三、下边咱们采用Beeline远程链接SqarkSQL而后访问Hive数据。oop
经过上边页面能够看到,系统能够正确将数据查询出来。学习
2、使用Java代码进行链接访问。测试
若是想要经过Java进行访问,首先要在引用一下三个Jar包:
<dependency> <groupId>org.apache.hive</groupId> <artifactId>hive-jdbc</artifactId> <version>1.2.1</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-common</artifactId> <version>2.4.1</version> </dependency> <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools</artifactId> <version>1.6</version> <scope>system</scope> <systemPath>${JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
须要注意的是,包的版本必定要确认好,切勿版本太高
若是发生如下错误:
org.apache.thrift.TApplicationException: Required field 'client_protocol' is unset! Struct:TOpenSessionReq(client_protocol:null)
则很可能的缘由是你项目的hive-jdbc版本和服务器不一致的缘由形成的,替换成和服务器一致的版本就能够了,
如下访问代码都已经通过了测试,拿走直接用,哈哈:
public static int hiveJDBC_RowCount(String sql,Map<Integer,String> params){ try { ResourceBundle rb = ResourceBundle.getBundle("config"); Class.forName(rb.getString("hivedriverClassName")).newInstance(); Connection conn = DriverManager.getConnection(rb.getString("hiveurl"),rb.getString("hiveusername"),rb.getString("hivepassword")); java.sql.PreparedStatement pstsm = conn.prepareStatement(sql); for(Integer key : params.keySet()){ pstsm.setString(key, params.get(key)); } ResultSet resultSet = pstsm.executeQuery(); int rowNum = 0; if(resultSet.next()){ rowNum = resultSet.getInt(1); } return rowNum; } catch (Exception e) { System.out.println(e); return 0; } }
hivedriverClassName=org.apache.hive.jdbc.HiveDriver hiveurl=jdbc:hive2://192.168.31.243:10000/default hiveusername=root hivepassword=