博主按:近一段时间,一直在研究Hadoop及其上的应用技术,因为之前一直做关系数据库系统的开发与维护,在众多基于Hadoop的技术中,Hive与Hbase的使用方法一直是自己关注的重点。为了对Hive技术有一个准确的认识,开始着手研究Hive的官方技术文档。在阅读的时候顺手按照自己的理解翻译出来,写在博客上,权当然阅读本记,纯属自娱自乐,如果能给浏览的诸君带来些许的参考,那真是不胜荣幸之至。而理解与翻译不确切的地方,还请大家海涵。
一、Hive命令行选项
1、为了获得有关Hive命令行的帮助,在控制台运行命令hive -H或者hive –help,可以获得有关Hive命令行的帮助。以下Hive 0.9.0版本的命令行选项:
-d,--define <key=value> 在Hive命令中使用变量替换(Variablesubstitution)。例:-d A=B or --defineA=B
-e<quoted-query-string> 在命令行模式下直接运行SQL语句
-f<filename> 在命令行模式下运行指定文件中的SQL语句
-H,--help 输出命令行选项信息
-h<hostname> 连接安装在远程主机上的Hive服务器
--hiveconf <property=value>连接Hive服务器时同时指定一些属性值
--hivevar<key=value> 应用到Hive命令中的变量替换(Variablesubstitution)。例如 --hivevarA=B
-i<filename> 指定初始化文件。如果在启动Hive时没有使用-i选项指定初始文件,CLI(Command LineInterface)将使
用$HIVE_HOME/bin/.hiverc and $HOME/.hiverc进行初始化。
-p<port> 连接到指定端口的Hive服务器
-S,--silent Hive以silent模式运行,命令执行过程中不输出中间信息
-v,--verbose Hive以verbose模式,在控制台显示SQL语句的执行状态
注:(1)自Hive 0.10.0始,增加了一个命令选项
--database <dbname> 指定操作的数据库
(2)关于变量替换(Variablesubstitution)的详细说明见下一篇
2、Hive命令行示例:
• 在命令行中嵌入SQL语句
$HIVE_HOME/bin/hive-e 'select a.col from tab1 a'
• 在命令行中嵌入SQL语句同时设置Hive运行参数值
$HIVE_HOME/bin/hive-e 'select a.col from tab1 a' -hiveconfhive.exec.scratchdir=/home/my/hive_scratch -hiveconf mapred.reduce.tasks=32
• 以silent模式执行SELECT语句,并且把查询结果导出到文本文件a.txt中
$HIVE_HOME/bin/hive-S -e 'select a.col from tab1 a' > a.txt
• 直接执行指定脚本文件中的SQL语句
$HIVE_HOME/bin/hive-f /home/my/hive-script.sql
• 在启动Hive的时候指定初始化脚本文件
$HIVE_HOME/bin/hive-i /home/my/hive-init.sql
3、Hive批处理模式命令
当加上-f或者-e选项时,Hive将在批处理模式下执行SQL语句
• hive -e'<query-string>' 执行一条SQL查询语句.
• hive -f <filepath> 执行包含在指定文件中的一条或者多条SQL查询语句.
示例见前述2
4、Hive交互式Shell模式命令
不加-f或者-e选项启动Hive,Hive则进入交互Shell模式。在Hive交互Shell模式下,输入的任何命令都须以“;”结束。在脚本文件中,通过“--”可以实现对命令加注释。下面是进入Hive交互Shell模式后常用的Hive命令
命令 说明
Quit或exit 退出Hive交互Shell模式命令.
reset 重新设置默认的配置项(Hive0.10新增:参见HIVE-3202).
set <key>=<value> 设置专门的配置变量(particularconfiguration variable)的值(key).需要注意的是如果参数变
量名拼写错误,CLI将不报错。
set 输出被用户或者Hive修改过的配置变量列表.
set -v 输出所有的Hadoop与Hive配置变量.
add FILE[S] <filepath><filepath>*
add JAR[S] <filepath> <filepath>*
add ARCHIVE[S] <filepath> <filepath>* 往分布式缓存(distributedcache)中的资源列表增加一个或者多个脚本、JAR或者archives文件.
list FILE[S]
list JAR[S]
list ARCHIVE[S] 输出已经存在于分布式缓存中的资源文件名.
list FILE[S] <filepath>*
list JAR[S] <filepath>*
list ARCHIVE[S] <filepath>* 检查指定的资源文件是否存在于分布式缓存中.
delete FILE[S] <filepath>*
delete JAR[S] <filepath>*
delete ARCHIVE[S] <filepath>* 删除分布式缓存中指定的资源文件.
! <command> 在Hive中执行一条控制柜命令.
dfs <dfs command> 在Hive中执行一条Hadoop的dfs command.
<query string> HiveSQL查询命令,以标准输出格式输出结果.
source FILE <filepath> 在Hive中执行一个脚本文件.
示例如下:
hive> set mapred.reduce.tasks=32;
hive> set;
hive> select a.* from tab1;
hive> !ls;
hive> dfs -ls;
5、运行日志
Hive使用log4j管理运行日志,运行日志信息不是直接输出,而是保存到由Hive的log4j参数指定的日志文件中。默认情况下,Hive使用警告级别(WARN level)把运行日志写入文件/tmp/<userid>/hive.log中,该文件在Hive安装目录下conf子目录中的Hive-log4j.default进行了指定。如果希望运行日志直接输出到控制台或者出于调试目的改变日志级别,可以通过下列命令来实现:
$HIVE_HOME/bin/hive-hiveconf hive.root.logger=INFO,console
通过hive.root.logger参数修改日志级别及输出目的地,console要求把运行信息输出到控制台而不是日志文件。
6、Hive资源
Hive可以管理查询会话(Session)运行期间需要添加的资源文件.资源文件可是脚本、JAR或者archives文件,任何本地可存取的文件都可以被加到会话中。对于加入到会话中的资源文件,Hive查询命令通过文件名引用它,并且可以在查询命令执行期间应用到整个Hadoop集群。在查询命令执行期间,Hive使用Hadoop的分布式缓存分配增加的资源文件给整个集群上的所有机器。
用法如下:
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <filepath1> [<filepath2>]*
LIST { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1><filepath2> ..]
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } [<filepath1><filepath2> ..]
(1)FILE类型资源是被增加到分布式缓存的可执行的实现转换任务的脚本文件.
(2)JAR类型资源也被加入Java classpath. 主要是了调用它们包含的一些自定义方法(UDFs).
(3)ARCHIVE resources are automatically unarchived as part ofdistributing them.
示例:
hive> add FILE /tmp/tt.py;
hive> list FILES;
/tmp/tt.py
hive> select from networks a
MAP a.networkid
USING 'python tt.py' as nn wherea.ds = '2009-01-04' limit 10;
如果同名文件已经在整个Hadoop集群中使用,那么FILE类型的资源文件就不必再附加:
• ... MAP a.networkidUSING 'wc -l' ...
在这里,wc即是一个是所有机器上有效的可应用资源.
• ... MAP a.networkidUSING '/home/nfsserv1/hadoopscripts/tt.py' ...
在这里,tt.py可以被NFS挂接点上的所有机器使用的资源文件( may be accessible via an NFS mount point that's configuredidentically on all the cluster nodes).
二、Beeline CLIfor HiveServer2
HiveServer2(在Hive 0.11引进)有一个新的CLI(Command LineInterface)被称为Beeline,它是一个基于SQLLine的JDBC客户端.关于Beeline这一新的命令行Shell请参见HiveServer2文档.
三、HCatalogCLI
HCatalog从Hive0.11.0开始引入Hive.许多(但不是全部)hcatcommands将成为hive commands,反之亦然.详细参照HCatalog手册中关于HCatalog Command Line Interface文档.