《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

本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6105571.html,如需转载请自行联系原作者

Hadoop Hive概念学习系列之hive里的扩展接口(CLI、Beeline、JDBC)(十六)相关推荐

  1. Hadoop Hive概念学习系列之hive里的HiveQL——查询语言(十五)

    Hive的操作与传统关系型数据库SQL操作十分类似. Hive主要支持以下几类操作: DDL 1.DDL:数据定义语句,包括CREATE.ALTER.SHOW.DESCRIBE.DROP等. 详细点, ...

  2. Hadoop Hive概念学习系列之hive的正则表达式初步(六)

    说在前面的话 hive的正则表达式,是非常重要!作为大数据开发人员,用好hive,正则表达式,是必须品! Hive中的正则表达式还是很强大的.数据工作者平时也离不开正则表达式.对此,特意做了个hive ...

  3. Hadoop Hive概念学习系列之hive的数据压缩(七)

    Hive文件存储格式包括以下几类: 1.TEXTFILE 2.SEQUENCEFILE 3.RCFILE 4.ORCFILE 其中TEXTFILE为默认格式,建表时不指定默认为这个格式,导入数据时会直 ...

  4. Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)...

    需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...

  5. Hadoop HDFS概念学习系列之熟练掌握HDFS的Shell访问(十五)

    调用文件系统(FS)Shell命令应使用 $HADOOP_HOME/bin/hadoop fs  *** 的形式!!! 所有的FS Shell命令使用URI路径作为参数. URI格式是scheme:/ ...

  6. 小说里的编程 【连载之二十六】元宇宙里月亮弯弯

    第二十六章 元宇宙之闭眼术 且说,牵凫氏非常着急地想领着勾叫,去看看自己的三次元作品. 牵凫氏想,勾叫这么久没呆在月球上,肯定很迫切地想知道,元宇宙里都发生了哪些奇闻趣事. 牵凫氏.勾叫进了外星人的元 ...

  7. Hadoop Hive概念学习系列之HDFS、Hive、MySQL、Sqoop之间的数据导入导出(强烈建议去看)(十八)...

    把MySQL里的数据导入到HDFS 1.使用MySQL工具手工导入 把MySQL的导出数据导入到HDFS的最简单方法就是,使用命令行工具和MySQL语句. 为了导出整个数据表或整个数据库的内容,MyS ...

  8. Hadoop Hive概念学习系列之HiveQL编译基础(十)

    由客户端提交的HiveQL语句将最终被转换为一个或多个MapReduce任务并提交由Hadoop执行.不包含聚合和连接的简单SELECT语句可以使用一个单独的只包含Map阶段的任务实现.使用GROUP ...

  9. Hadoop HBase概念学习系列之HRegion服务器(三)

    所有的数据库数据一般是保存在Hadoop分布式系统上面的,用户通过一系列HRegion服务器获取这些数据.一台机器上一般只运行一个HRegion服务器,而且每一分区段的HRegion也只会被一个HRe ...

  10. Hadoop HDFS概念学习系列之HDFS升级和回滚机制(十二)

    不多说,直接上干货! HDFS升级和回滚机制 作为一个大型的分布式系统,Hadoop内部实现了一套升级机制,当在一个集群上升级Hadoop时,像其他的软件升级一样,可能会有新的bug或一些会影响现有应 ...

最新文章

  1. 新手问题之找不到R文件
  2. Windows 2008 R2 SP1部署Exchange2010 SP1(原创)
  3. 剑指offer 平衡二叉树
  4. [老老实实学WCF] 第七篇 会话
  5. 介绍KeyTool GUI工具2款
  6. C#3.0扩展方法[转]
  7. 年轻群体当道,哈弗F7如何赢得芳心?
  8. 延时消息_手把手实现一条延时消息
  9. LiveVideoStackCon 2018公布优秀出品人与讲师
  10. 有关EMMC、Nandflash、SSD、HDD的科普类说明
  11. 蓝桥杯大赛青少年创意编程 第十一届 省赛 C++组试题 第1题 双面打印
  12. javascript图片轮换
  13. 绘制隐藏层的激活值的分布[直方图]
  14. unix和linux命令_在Linux / UNIX中查找命令
  15. 2017/05/04 java 基础 随笔
  16. 多元函数的极值及其求法
  17. Java架构师—PDMan数据库建模工具使用
  18. leaflet+D3
  19. html怎么画正方形的斜线,html – 斜线的样式
  20. 雪球 feed流爬虫

热门文章

  1. 蓝懿iOS培训日志22 图册
  2. ScrewTurn Wiki 初识
  3. 去掉字符串最后一个字符
  4. 精确的硬盘整数分区方法
  5. 用上帝视角来看待组件的设计模式
  6. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边
  7. python 函数写商城管理系统
  8. 【学习笔记】信息系统项目管理-项目採购管理-合同分类
  9. opensuse 安装 Anaconda3 之后出现Could not start d-bus. Can you call qdbus?
  10. JS兼容性问题:window.locatin.href is not a function