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 命令解读的主要内容,如果未能解决你的问题,请参考以下文章