《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