Hadoop Hive概念學習系列之hive里的擴展接口(CLI、Beeline、JDBC)(十六)


《Spark最佳實戰  陳歡》寫的這本書,關於此知識點,非常好,在94頁。 

 

 

hive里的擴展接口,主要包括CLI(控制命令行接口)、Beeline和JDBC等方式訪問Hive。

  CLI和Beeline都是交互式用戶接口,並且功能相似,但是語法和實現不同

  JDBC是一種類似於編程訪問關系型數據庫的編程接口

 

 

 

 

 

1、CLI

  在UNIX shell環境下輸入hive命令可以啟用Hive CLI。在CLI下,所有的Hive語句都以分號結束。

在CLI下可以對一些屬性做出設置,像是設置底層MapReduce任務中Reducer的實例數。這些信息都詳細地記錄在在線Hive語言手冊中。

下面是一些專門針對Hive,並且對使用Hive CLI非常有幫助的屬性:

  hive.cli.print.header:當設置為true時,查詢返回結果的同時會打印列名。默認情況下設置為false。因此不會打印。

             想要開啟列名打印的功能需要輸入以下指令。

             hive > set hive.cli.print.header=true;

  hive.cli.print.current.db:當設置為true時,將打印當前數據庫的名字。默認情況下設置為false。

            可以通過輸入以下指令修改屬性:

            hive > set hive.cli.print.current.db=true;

            hive (default) >

  

 

 

 

2、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一樣

 

 

 

 

3、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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM