• 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) + " " +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(" ");
      }
      System.out.println();
      while(res.next()){
      for(int i=0;i<ncols;i++){
        System.out.print(res.getString(i+1));
        System.out.print(" ");
      }
      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) + " " +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)) + " " + res.getString(2));
        System.out.print(" ");
      }

      //统计查询
      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) + " " +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)) + " " + res.getString(2));
    System.out.print(" ");
    }

    执行一个统计查询,统计数据记录的行数并打印输出统计结果

    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

  • 相关阅读:
    超好看的UI配色网站汇总~
    JS获取非行内样式
    最近看到的一些不错前端面试题目
    指令
    $filter $watch
    学习学习学习
    Mongoose by时间查询
    AngularJs 学习 笔记 4 foreach
    AngularJs 学习 笔记 3
    AngularJs 学习 笔记 2
  • 原文地址:https://www.cnblogs.com/zlslch/p/6105571.html
Copyright © 2020-2023  润新知