Hive CLI 命令解读

Posted @SmartSi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hive CLI 命令解读相关的知识,希望对你有一定的参考价值。

1. Hive 命令行选项

如果想查看 Hive 命令行选项,可以执行 hive -Hhive --help 来获取:

localhost:script wy$ hive -H
usage: hive
 -d,--define <key=value>          Variable substitution to apply to Hive
                                  commands. e.g. -d A=B or --define A=B
    --database <databasename>     Specify the database to use
 -e <quoted-query-string>         SQL from command line
 -f <filename>                    SQL from files
 -H,--help                        Print help information
    --hiveconf <property=value>   Use value for given property
    --hivevar <key=value>         Variable substitution to apply to Hive
                                  commands. e.g. --hivevar A=B
 -i <filename>                    Initialization SQL file
 -S,--silent                      Silent mode in interactive shell
 -v,--verbose                     Verbose mode (echo executed SQL to the
                                  console)

1.1 Hive 批模式命令

$HIVE_HOME/bin/hive 运行时使用带 -e-f 选项时,将以批处理方式执行 SQL 命令:

  • hive -e <query-string> 执行查询字符串。
  • hive -f <filepath> 执行文件中的一个或多个SQL查询。

例如,使用如下命令以非交互式方式从命令行中运行查询:

hive -e 'SHOW TABLES;'

例如,使用如下命令以非交互式方式运行本地的 HQL 脚本:

hive -f /home/my/hive-script.sql

例如,使用如下命令以非交互式方式运行 Hadoop 支持的文件系统上的脚本:

hive -f hdfs://<namenode>:<port>/hive-script.sql

1.2 变量和属性

1.2.1 命名空间

在介绍变量和属性之前,我们先看一下 Hive 中的 4 种内置命名空间:hivevar、hiveconf、system 以及 env。

命名空间使用权限说明
hivevar可读、可写用户自定义变量,Hive 0.8.0 及以后版本有效
hiveconf可读、可写Hive 相关的配置属性
system可读、可写Java 定义的配置属性
env只可读Shell 环境(例如,bash) 定义的环境变量

1.2.2 hivevar

可以通过 --define key=value--hivevar key=value 命令在 hivevar 命名空间自定义变量,两者是等价的,都可以让用户在命令行中自定义用户变量以便在 Hive 脚本中引用。如下所示通过 --define 命令定义了一个变量 dt:

localhost:~ wy$ hive --define dt=2015-08-01;
...
Logging initialized using configuration in file:/opt/apache-hive-2.3.4-bin/conf/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> set dt;
dt=2015-08-01
hive (default)> set hivevar:dt;
hivevar:dt=2015-08-01

通过 SET 查看 dt 的值可以发现变量 dt 是定义在 hivevar 命名空间下的。通过 hive --hivevar dt=2015-08-01; 命令也可以达到相同的效果。

Hive 变量内部是以 Java 字符串的方式存储的,用户可以在查询中引用变量。Hive 会先使用变量值替换掉查询中的变量引用,然后才会将查询语句提交给查询处理器。如下两个 SQL 语句是等价的:

SELECT COUNT(*) FROM behavior
WHERE SUBSTR(time, 1, 10) = '$hivevar:dt';

SELECT COUNT(*) FROM behavior
WHERE SUBSTR(time, 1, 10) = '2015-08-01';

1.2.2 hiveconf

hiveconf 选项是 Hive 0.7.0 版本才开始支持的功能,用于配置 Hive 行为的所有属性。例如,我们可以使用该选项指定 hive.cli.print.header 属性来打印表头(默认为 false):

localhost:~ wy$ hive --hiveconf hive.cli.print.header=true;
...
Logging initialized using configuration in file:/opt/apache-hive-2.3.4-bin/conf/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> set hive.cli.print.header;
hive.cli.print.header=true
hive (default)> set hiveconf:hive.cli.print.header;
hiveconf:hive.cli.print.header=true
hive (default)>

此外,我们还可以增加新的 hiveconf 属性,这个功能只有 Hive 0.8.0 版本才开始支持:

localhost:~ wy$ hive --hiveconf dt=2022-10-01;
...
Logging initialized using configuration in file:/opt/apache-hive-2.3.4-bin/conf/hive-log4j2.properties Async: true
Hive-on-MR is deprecated in Hive 2 and may not be available in the future versions. Consider using a different execution engine (i.e. spark, tez) or using Hive 1.X releases.
hive (default)> set dt;
dt=2022-10-01
hive (default)> set hivevar:dt;
hivevar:dt is undefined as a hive variable
Query returned non-zero code: 1, cause: null
hive (default)> set hiveconf:dt;
hiveconf:dt=2022-10-01
hive (default)>

通过上面语句可以发现 dt 属性是定义在 hiveconf 命名空间下的,而不是定义在 hivevar 命名空间下。

dt 认为是变量也没有问题,只是定义在不同命名空间下而已。变量和属性是在不同的上下文中使用的术语,但是在大多数情况下它们的功能是相同的

1.2.3 system

可以通过如下命令查看 system 命名空间下 Java 定义的配置属性:

hive (default)> set system:user.name;
system:user.name=wy

和 hivevar 和 hiveconf 不同,用户必须使用 sytem: 前缀来指定系统属性。

1.2.4 env

可以通过如下命令查看 env 命名空间下 Shell 环境(例如,bash) 定义的环境变量:

hive (default)> set env:HIVE_HOME;
env:HIVE_HOME=/opt/hive

和 hivevar 和 hiveconf 不同,用户必须使用 env: 前缀来指定环境变量。

1.3 静默模式

使用 -S 命令进入 hive 的静默模式,只显示查询结果,不显示执行过程;如下所示使用静默模式执行 HQL 语句:

hive -S -e 'SELECT COUNT(*) FROM behavior';

这样可以在输出中去掉 ‘OK’、‘Time taken’ 等无关的输出。

1.4 hiverc 文件

CLI 选项有一个 -i 选项,允许用户指定一个文件,当 CLI 启动时,在提示符出现前会先执行这个文件。Hive 会自动在 HOME 目录下寻找名为 .hiverc 的文件,而且会自动执行这个文件中的命令(如果文件有的话)。对于用户使用比较频繁的命令,使用这个文件是非常方便的。下面的例子展示了一个典型的 $HOME/.hiverc 文件中的内容:

set hive.cli.print.current.db=true;
set hive.exec.mode.local.auto=true;

我们也可以为 -i 选项手动指定配置文件:

hive -i /opt/conf/hive-init.conf;

其中 hive-init.conf 的内容如下:

set hive.cli.print.header=true;

如果通过 -i 选项手动指定了配置文件,那么就不会再执行 $HOME/.hiverc 文件中的命令了。

2. Hive 交互式 Shell 命令

当使用 $HIVE_HOME/bin/hive 命令运行,并且没有 -e-f 选项时,会进入到交互式 Shell 模式:

命令描述
quitexit退出交互式 Shell 模式
reset将配置重置为默认值
set <key>=<value>为指定配置选项设置值
set打印由用户或 Hive 覆盖后的配置变量列表
set -v打印所有 Hadoop 和 Hive 配置变量
add FILE[S] <filepath> <filepath>*add JAR[S] <filepath> <filepath>*add ARCHIVE[S] <filepath> <filepath>*将一个或多个文件,jar或归档添加到分布式缓存中的资源列表
list FILE[S]list JAR[S]list ARCHIVE[S]列出已添加到分布式缓存中的资源
delete FILE[S] <filepath>*delete JAR[S] <filepath>*delete ARCHIVE[S] <filepath>* `从分布式缓存中删除资源
! <command>Hive shell 中执行 shell命令
dfs <dfs command>Hive shell 中执行 dfs 命令
<query string>执行 Hive 查询并将结果打印到标准输出
source FILE <filepath>在 CLI 客户端中执行脚本文件

以上是关于Hive CLI 命令解读的主要内容,如果未能解决你的问题,请参考以下文章

Hive 源码解读 CLI 入口 CliDriver

Hive 源码解读 CliDriver HQL 读取与参数解析

Hive 源码解读 CliDriver HQL 命令处理

Hive 源码解读 CliDriver HQL 命令处理

Hive 源码解读 CliDriver HQL 命令处理

Hive的一些基本命令