Hive CLI
$HIVE_HOME/bin/hive 是一个 shell工具,可用于以交互方式或批处理方式运行Hive 查询。
Hive命令行选项
要获得帮助,请运行“hive -H
”或“hive --help
”。
Hive 0.9.0的命令行选项如下:
usage: hive
-d,--define <key=value> 在hive命令行中定义变量
e.g. -d A=B or --define A=B
-e <quoted-query-string> 从命令行执行SQL
-f <filename> 从文件执行SQL
-H,--help 打印帮助信息
-h <hostname> 使用远程主机连接Hive Server
--hiveconf <property=value> 使用给定的配置,
--hivevar <key=value> 提供给Hive命令行的变量
e.g. --hivevar A=B
-i <filename> 初始化SQL文件
-p <port> 连接到Hive Server 的端口号
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
版本信息
从 Hive 0.10.0 开始,还有一个额外的命令 line 选项:
--database <dbname> 指定要使用的数据库
-
例子
-
从命令行运行查询的示例
$HIVE_HOME/bin/hive -e 'select a.col from tab1 a'
-
设置 Hive configuration 变量的示例
$HIVE_HOME/bin/hive -e 'select a.col from tab1 a' --hiveconf hive.exec.scratchdir=/home/my/hive_scratch --hiveconf mapred.reduce.tasks=32
-
使用静默模式将数据从查询转储到文件中的示例
$HIVE_HOME/bin/hive -S -e 'select a.col from tab1 a' > a.txt
-
从本地磁盘运行非交互式脚本的示例
$HIVE_HOME/bin/hive -f /home/my/hive-script.sql
-
从 Hadoop 支持的文件系统中运行非交互式脚本的示例
$HIVE_HOME/bin/hive -f hdfs://<namenode>:<port>/hive-script.sql $HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql
-
在进入交互模式之前运行初始化脚本的示例
$HIVE_HOME/bin/hive -i /home/my/hive-init.sql
-
-
hiverc文件
在没有
-i
选项的情况下调用 CLI 将尝试加载 H I V E H O M E / b i n / . h i v e r c 和 HIVE_HOME/bin/.hiverc 和 HIVEHOME/bin/.hiverc和HOME/.hiverc 作为初始化 files。关于日志记录
Hive 使用 log4j 进行日志记录。默认情况下,这些日志不会发送到标准输出,而是捕获到 Hive 的 log4j properties 文件指定的 log 文件中。默认情况下,Hive 将在 Hive 安装的
conf/
目录中使用hive-log4j.default
,该目录将日志写入/tmp//hive.log
并使用WARN
级别记录。通常需要将日志发送到标准输出 and/or 更改 logging level 以进行调试。这些可以通过命令 line 完成,如下所示:
$HIVE_HOME/bin/hive --hiveconf hive.root.logger=INFO,console
hive.root.logger
指定 logging level 以及 log 目标。将console
指定为目标会将日志发送到标准错误(而不是 log 文件)。
Hive批处理模式命令
当$HIVE_HOME/bin/hive
与-e
或-f
选项一起运行时,它以批处理模式执行 SQL 命令。
hive -e ''
执行查询 string。hive -f
从文件执行一个或多个 SQL 查询。
从 Hive 0.14 开始,可以来自 Hadoop 支持的文件系统之一(HDFS,S3,etc.))。
$HIVE_HOME/bin/hive -f hdfs://:/hive-script.sql` `$HIVE_HOME/bin/hive -f s3://mys3bucket/s3-script.sql
Hive交互式Shell 命令
当$HIVE_HOME/bin/hive
在没有-e
或-f
选项的情况下运行时,它将进入交互式 shell 模式。使用 ”;” (分号)终止命令。可以使用“ – ”前缀指定脚本中的注释。
具体命令见Hive命令和CLI(一)
Hive资源
Hive 可以管理是否向 session 添加资源,其中这些资源需要在查询执行时提供。资源可以是 files,jars 或 archives。可以将任何本地可访问的文件添加到 session。
将资源添加到 session 后,Hive 查询可以通过其 name(在 map/reduce/transform 子句中)引用它,并且资源在整个 Hadoop cluster 上的执行时在本地可用。 Hive 使用 Hadoop 的分布式缓存在查询执行时将添加的资源分发到 cluster 中的所有计算机。
用法:
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> ..]
- FILE 资源只是添加到分布式缓存中。通常,这些资源可能是要执行的转换脚本。
- JAR 资源也被添加到 Java classpath 中。这在对象引用中是必需的,它们包含诸如 UDF 之类的对象。有关自定义 UDF 的更多信息,请参见Hive 插件。
- ARCHIVE 资源会自动取消归档,作为分发它们的一部分。
例:
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 where a.ds = '2009-01-04' limit 10;
从Hive 1.2.0开始,可以使用 ivy://group:module:version?query_string 形式的lvy URL 添加和删除资源。
- group - 模块来自哪个模块 group。直接转换为 Maven groupId 或 Ivy Organization。
- module - 要加载的模块的 name。直接转换为 Maven artifactId 或 Ivy artifact。
- version - 要使用的模块的 version。可以使用任何 version 或*(最新)或 Ivy 范围。
可以在查询语句中传递各种参数,以配置如何以及将哪些 jars包添加到工件中。参数采用 key value 对的形式,由’&'进行分隔。
用法:
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version?key=value&key=value&...> <ivy://org:module:version?key=value&key1=value1&...>*
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } <ivy://org:module:version> <ivy://org:module:version>*
此外,我们可以在相同的 ADD 和 DELETE 命令中混合使用和。
ADD { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>*
DELETE { FILE[S] | JAR[S] | ARCHIVE[S] } { <ivyurl> | <filepath> } <ivyurl>* <filepath>*
可以传递的不同参数是:
- exclude:以 org:module 形式使用逗号分隔的 value。
- transitive:取值 true 或 false。默认为 true。当 transitive = true 时,将下载所有传递依赖项并将其添加到 classpath。
- ext:要添加的文件的扩展名。默认情况下为 ‘jar’。
- 分类器:要解析的 maven 分类器。
例子:
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro;
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0?exclude=org.apache.hadoop:avro&transitive=false;
除非某些依赖项由其他资源共享,否则 DELETE 命令将删除资源及其所有传递依赖项。如果两个资源共享一组传递依赖项,并且使用 DELETE 语法删除其中一个资源,则除了共享的资源外,将删除资源的所有传递依赖项。
例子:
hive>ADD JAR ivy://org.apache.pig:pig:0.10.0
hive>ADD JAR ivy://org.apache.pig:pig:0.11.1.15
hive>DELETE JAR ivy://org.apache.pig:pig:0.10.0
如果 A 是包含 pig-0.10.0 的传递依赖性的集合,并且 B 是包含 pig-0.11.1.15 的传递依赖性的集合,则在执行上述命令之后,将删除 A-(A 交集 B)。
如果转换脚本中使用的 files 已经在 Hadoop cluster 中使用相同路径 name 的所有计算机上可用,则不必将 files 添加到 session。例如:
... MAP a.networkid USING 'wc -l' ...
这里wc
是所有机器上都可用的可执行文件。... MAP a.networkid USING '/home/nfsserv1/hadoopscripts/tt.py' ...
这里tt.py
可以通过在所有 cluster 节点上配置相同的 NFS 挂载点访问。
请注意,Hive configuration 参数还可以指定 jars,files 和 archives。