《Spark最佳实战 陈欢》写的这本书,关于此知识点,很是好,在94页。 java
hive里的扩展接口,主要包括CLI(控制命令行接口)、Beeline和JDBC等方式访问Hive。sql
CLI和Beeline都是交互式用户接口,而且功能类似,可是语法和实现不一样。shell
JDBC是一种相似于编程访问关系型数据库的编程接口。数据库
一、CLIapache
在UNIX shell环境下输入hive命令能够启用Hive CLI。在CLI下,全部的Hive语句都以分号结束。编程
在CLI下能够对一些属性作出设置,像是设置底层MapReduce任务中Reducer的实例数。这些信息都详细地记录在在线Hive语言手册中。api
下面是一些专门针对Hive,而且对使用Hive CLI很是有帮助的属性:服务器
hive.cli.print.header:当设置为true时,查询返回结果的同时会打印列名。默认状况下设置为false。所以不会打印。ide
想要开启列名打印的功能须要输入如下指令。函数
hive > set hive.cli.print.header=true;
hive.cli.print.current.db:当设置为true时,将打印当前数据库的名字。默认状况下设置为false。
能够经过输入如下指令修改属性:
hive > set hive.cli.print.current.db=true;
hive (default) >
二、Beeline
Beeline能够做为标准命令行接口的替代者。它使用JDBC链接Hive,并且基于开源的SQLLine项目。
Beeline的工做方式和Hive CLI很像,可是使用Beeline须要与Hive创建显示的链接:
$ beeline
Beeline version 0.11.0 by Apache Hive
beeline > !connect jdbc:hive:// nouser nopassword
本地模式中使用的JDBC的URL是jdbc:hive//。若是是集群中的配置,那么JDBC的URL一般是这样的形式:dbc:hive//<hostname>:<port>。
<hostname>是Hive服务器的主机名,<port>是预先配置的端口号(默认为10000)。
这样的状况下,咱们可使用Beeline执行任何Hive语句,与使用CLI同样。
三、JDBC
Java客户端可使用预先提供的JDBC驱动来链接Hive。链接步骤和其余兼容JDBC的数据库同样。首先载入驱动,而后创建链接。
JDBC驱动的类名是org.apache.hadoop.hive.jdbc.HiveDriver。
本地模式中使用的JDBC的URL是jdbc:hive://。
若是是集群中的配置,那么JDBC的URL一般是这样的形式:jdbc:hive//<hostname>:<port>。
<hostname>是Hive服务器的主机名,<port>是预先配置的端口号(默认为10000)。
给一个例子,展现使用JDBC链接本地模式的Hive,并提交查询请求:
import java.sql.Connection;
import java.sql.Driver;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
public class HiveJdbcClient{
private static String driverName="org.apache.hadoop.hive.jdbc.HiveDriver";
public static void main(String[] args)throws Exception{
LogManager.getRootLogger().setLevel(Level.ERROR);
Class.forName(driverName);
Connection con=DriverManager.getConnection(
"jdbc:hive://","","");
Statement stmt=con.createStatement();
stmt.executeQuery(:drop table videos_ex);
ResultSet res=stmt.executeQuery("CREATE EXTERNAL TABLE videos_ex" +
"(producer string,title string,category string,year int)" +
"ROW FROMAT DELTMTIED FIELDS TERMINATED BY \",\" LOCATION " +
"/home/madhu/external/videos_ex/data");
//show tables
String sql = "show tables";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
if(res.next()){
System.out.println(res.getString(1));
}
//describe table
sql="describe videos_ex";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(1) + "\t" +res.getString(2));
}
//select query
sql="select * from videos_ex";
System.out.println("Running:" + sql);
res=stmt.executeQuery(sql);
ResultSetMetaData rsmd=res.getMetaData();
int ncols=rsmd.getColumnCount();
for(int i=0;i<ncols;i++){
System.out.print(rsmd.getColumnLabel(i+1));
System.out.print("\t");
}
System.out.println();
while(res.next()){
for(int i=0;i<ncols;i++){
System.out.print(res.getString(i+1));
System.out.print("\t");
}
System.out.println();
}
//regular hive query
sql ="select count(1) from videos_ex";
System.out.println.("Running:" +sql);
res=stmt.executeQuery(sql);
if(res.next()){
System.out.println("Number of rows:" + res.getString(1));
}
}
}
再次谈谈 Hive JDBC编程接口与程序设计
Hive支持标准的数据库查询接口JDBC,在JDBC中须要指定驱动字符串以及链接字符串,Hive使用的驱动器字符串为“org.apache.hadoop.hive.jdbc.HiveDriver”。
在Hive的软件包中已经加入了对应的JDBC的驱动程序,链接字符串标志了将要访问的Hive服务器。例如 jdbc://master:10000/default,在配置链接字符串后能够直接使用传统的JDBC编程技术去访问Hive所提供的功能。
固然这里,能够,手动。通常包括
commons-lang-*.*.jar
commons-logging-*.*.*.jar
commons-logging-api-*.*.*.jar
hadoop-core-*.*.*-Intel.jar
hive-exec-*.*.*-Intel.jar
hive-jdbc*.*.*Intel.jar
hive-metastore-*.*.*-Intel.jar
libfb***-*.*.*.jar
log4j-*.*.*.jar
slf4j-api-*.*.*.jar
slf4j-log4j*-*.*.*.jar
为了展现如何基于Hive JDBC进行具体的java编程,设有以下预存在文件中的样例数据:
1&data1_value
2&data2_value
3&data3_value
...
198&data198_value
199&data199_value
200&data200_value
所演示的示例程序将首先建立应Hive表,而后将存放在上述文件中的样例数据装入到这个Hive表中,并经过查询接口并显示出这些数据。
基于Hive JDBC的Java编程示例代码以下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Driver;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
//该类用于将Hive做为数据库,使用JDBC链接Hive,实现对Hive进行增、删、查等操做。
public class classHiveJdbc{
private static String driverName="org.apache.hadoop.hive.jdbc.HiveDriver";
/**
*实现链接Hive,并对Hive进行增、删、查等操做
*/
public static void main(String[] args)throws SQLException{
LogManager.getRootLogger().setLevel(Level.ERROR);
{
try{
Class.forName(driverName);
}catch (ClassNotFoundException e){
e.printStackTrace();
System.exit(1);
}
Connection con=DriverManager.getConnection(
"jdbc:hive://192.168.81.182:100000/hivebase","","");
Statement stmt=con.createStatement();
String tableName="HiveTables";
//删除和建立数据表
stmt.executeQuery("DROP TABLE" + tableName);
ResultSet res=stmt.executeQuery("CREATE TABLE " + tableName +
"(key int,value string)" +
"ROW FROMAT DELTMTIED FIELDS TERMINATED BY '&' +
stored as textfile);
//检查和显示数据表
String sql = "SHOW TABLES '" + tableName + "'";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
if(res.next()){
System.out.println(res.getString(1));
}
//显示数据表字段描述信息
sql="describe" + tableName";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(1) + "\t" +res.getString(2));
}
//将文件数据装载到Hive表中
String filepath="/Test/data.txt";
sql="load data local inpath '" + filepath + "' into table " + tableName;
System.out.println("Running:" + sql);
res=stmt.executeQuery(sql);
//字段查询
sql="select * from" + tableName;
System.out.println("Running:" + sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.print(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
System.out.print("\t");
}
//统计查询
sql ="select count(1) from tableName";
System.out.println.("Running:" +sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(1));
}
}//main函数结束
}//HiveJdbc类结束
如下对程序中的重要部分进行说明。
private static String driverName="org.apache.hadoop.hive.jdbc.HiveDriver"; 为驱动字符串。
Class.forName(driverName); 为完成加载数据库驱动,它的主要功能为加载指定的class文件到java虚拟机的内存。
Connection con=DriverManager.getConnection(
"jdbc:hive://192.168.81.182:100000/hivebase","",""); 为链接字符串,这里须要制定服务器IP以及所用到的数据库。因为Hive不须要用户名和密码,因此第2个参数和第3个参数为空。
加载好驱动,配置好链接数据库字符串之后,即可以编写语句对Hive进行相应的操做。
若是操做的数据表已经存在,能够先将该表删掉,如stmt.executeQuery("DROP TABLE" + tableName);
删除表后,27行再建立表。
ResultSet res=stmt.executeQuery("CREATE TABLE " + tableName +
"(key int,value string)" +
"ROW FROMAT DELTMTIED FIELDS TERMINATED BY '&' +
stored as textfile);
在使用JDBC对Hive进行表的操做时所用到的语句与命令行的语句彻底相同,只须要在程序中拼接出相应的语句便可。
建立表后,查看数据库是否有该表,将查询回来的结果输出到控制台。
String sql = "SHOW TABLES '" + tableName + "'";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
if(res.next()){
System.out.println(res.getString(1));
}
对表结构的查询、向表加载数据、查询数据以及统计等操做都可以经过与Hive命令相同的方式进行。
显示该表的字段结构信息,共有Key和value两个字段。
sql="describe" + tableName";
System.out.println("Running:" +sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(1) + "\t" +res.getString(2));
}
将前述预存在一个文件中的数据装载到数据表中。
String filepath="/Test/data.txt";
sql="load data local inpath '" + filepath + "' into table " + tableName;
System.out.println("Running:" + sql);
res=stmt.executeQuery(sql);
执行常规的字段数据查询,并打印输出查询结果
sql="select * from" + tableName;
System.out.println("Running:" + sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.print(String.valueOf(res.getInt(1)) + "\t" + res.getString(2));
System.out.print("\t");
}
执行一个统计查询,统计数据记录的行数并打印输出统计结果
sql ="select count(1) from tableName";
System.out.println.("Running:" +sql);
res=stmt.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(1));
}
最后,执行,获得,如下为程序执行后控制台输出的日志:
1 data1_value
2 data2_value
3 data3_value
4 data4_value
5 data5_value
...
198 data198_value
199 data199_value
200 data200_value
Running:select count(1) from HiveTables
200