【Hive】02-Hive命令

$HIVE_HOME/bin/hive这个shell命令(后面我们省略称为hive)是通向包括命令行界面也就是CLI等Hive服务的通道。
我们假定用户已经将$HIVE_HOME/bin加人到环境变量PATH中了,则用户只需要在shell提示符中输人hive,就可以使用户的shell环境(例如bash环境)找到这个命令。


1、命令选项

如果用户执行下面的命令,那么可以查看到hive命令的一个简明说明的选项列表。

Usage ./hive <parameters> --service serviceName <service parameters>
Service List: beeline cleardanglingscratchdir cli fixacidkeyindex help hiveburninclient hiveserver2 hplsql jar lineage llap llapdump llapstatus metastore metatool orcfiledump rcfilecat schemaTool strictmanagedmigration tokentool version
Parameters parsed:
  --auxpath : Auxiliary jars
  --config : Hive configuration directory
  --service : Starts specific service/component. cli is default
Parameters used:
  HADOOP_HOME or HADOOP_PREFIX : Hadoop install directory
  HIVE_OPT : Hive options
For help on a particular service:
  ./hive --service serviceName --help
Debug help:  ./hive --debug --help

需要注意Service后面的内容。这里提供了几个服务,包括我们绝大多数时间将要使用的CLI。用户可以通过--service name服务名称来启用某个服务,尽管其中有几个服务也是有快捷启动方式的。

2、 变量和属性

--define key=value实际上和--hivevar key=value是等价的。二者都可以让用户在命令行定义用户自定义变量以便在Hive脚本中引用,来满足不同情况的执行。当用户使用这个功能时,Hive会将这些键-值对放到hivevar命名空间,这样可以和其他3种内置命名空间(也就是hiveconf、system和env),进行区分。
提示:变量或者属性是在不同的上下文中使用的术语,但是在大多数情况下它们的功能是相同的。

Hive中变量和属性命名空间
命名空间使用权限描述
hivevar可读/可写用户自定义变量
hiveconf可读/可写Hive相关的配置属性
system可读/可写Java定义的配置属性
env只可读Shell环境(例如bash)定义的环境变量

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

在CLI中,可以使用SET命令显示或者修改变量值。例如,下面这个会话先显示一个变量的值,然后再显示env命名空间中定义的所有变量!为了更清晰地表现,我们省略掉了这个Hive会话中的一些输出信息,而且在每行命令之间人为地增加了一个空白行:

$hive
hive>set env:HOME;
env:HOME=/home/thisuser

hive>set;
...非常多的输出信息,而且包含有下面这些变量的:
hive.stats.retries.wait=3000
env:TERM=xterm
system:user.timezone=America/New_York
...

hive>set -v;
...更多的输出信息!...

如果不加-v标记,命令会打印出命名空间hivevar,hiveconf,system和env中所有的变量。使用.v标记,则还会打印Hadoop中所定义的所有属性,例如控制HDFS和MapReduce的属性。
set命令还可用于给变量赋新的值。我们特别看下hivevar命名空间以及如何通过命令行定义一个变量:

$hive --define foo=bar
hive> set foo;
foo=bar;

hive>set hivevar:foo;
hivevar:foo=bar;

hive>set hivevar:foo=bar2;

hive>set f00;
foo=bar2

hive>set hivevar:foo;
hivevar:foo=bar2

我们可以看到,前缀hivevar:是可选的。--hivevar标记和--define标记是相同的。
在CLI中查询语句中的变量引用会先被替换掉然后才会提交给查询处理器。思考如下这个CLI会话:

hive>create table toss1 (i int,$(hivevar:foo} string);
hive>describe toss1;
i                int
bar2          string

hive>create table toss2(i2 int,${foo} string);

hive>describe toss2;
i2               int
bar2          string

hive>drop table toss1;
hive>drop table toss2;

我们来看看--hiveconf选项,其用于配置Hive行为的所有属性。我们用它来指定hive.cli.pnnt.current.db属性。开启这个属性可以在CLI提示符前打印出当前所在的数据库名,默认的数据库名为default。这个属性的默认值是false。

$hive --hiveconf hive.cli.print.current.db=true
hive (default)>set hive.cli.print.current.db;
hive.cli.print.current.db=true

hive (default)>set hiveconf:hive.cli.print.current.db;
hiveconf:hive.cli.print.current.db=true

hive (default)>set hiveconf:hive.cli.print.current.db=false;
hive>set hiveconf:hive.cli.print.current.db=true;

我们甚至可以增加新的hiveconf属性:

$hive --hiveconf y=5
hive>set y;
y=5

hive>CREATE TABLE whatsit (i int);
hive>...装载数据到表whatsit中

hive>SELECT * FROM whatsit WHERE i=${hiveconf:y);

我们还有必要了解一下system命名空间,Java系统属性对这个命名空间内容具有可读可写权利;而env命名空间,对于环境变量只提供可读权限:

hive>set system:user.name;
system:user.name=myusername
hive>set system:user.name=yourusername;

hive>set system:user.name;
system:user.name=yourusername
hive>set env:HOME;
env:HOME=/home/yourusername

hive>set env:HOME;
env*:variables can not be set.

和hivevar变量不同,用户必须使用system:或者env:前缀来指定系统属性和环境变量。
env命名空间可作为向Hive传递变量的一个可选的方式,考虑如下这个例子:

$YEAR=2012 hive -e "SELECT * FROM mytable WHERE year = $(env:YEAR}";

Hive中所有的内置属性都在$HIVE_HOME/conf/hivedefault.xml.template中列举出来了,这是个“样例”配置文件“,配置文件中还说明了这些属性的默认值。

3、Hive中一次使用命令

用户可能有时期望执行一个或者多个查询(使用分号分隔),执行结束后hiveCLI立即退出。Hive提供了这样的功能,因为CLI可以接受心命令这种形式。如果表mytable具有一个字符串字段和一个整型字段,我们可以看到如下输出:

$hive -e "SELECT * FROM mytable LIMIT 3"

OK
name1 10
name2 20
name3 30
Time taken:4.955seconds
临时应急时可以使用这个功能将查询结果保存到一个文件中。增加-S选项可以开启静默模式,这样可以在输出结果中去掉"OK”和"Timetaken”等行,以及其他一些无关紧要的输出信息,如下面这个例子:

$hive -S -e "select * FROM mytable LIMIT 3">/tmp/myquery
$cat/tmp/myquery

name1 10
name2 20
name3 30
需要注意的是,Hive会将输出写到出中。上面例子中的shell命令将输出重定向到本地文件系统中,而不是HDFS中。
最后,当用户不能完整记清楚某个属性名时,可以使用下面这个非常有用的技巧来模糊获取这个属性名而无需滚动set命令的输出结果进行查找。假设用户没记清哪个属性指定了管理表的“warehouse数据仓库的路径,通过如下命令可以查看到:

$hive -S -e"set" | grep warehouse

hive.metastore.warehouse.·dir=/user/hive/warehouse
hive.warehouse.subdir.inherit.perms=false
这是第一种情况。

4、从文件中执行查询

Hive中可以使用-f文件名方式执行指定文件中的一个或者多个查询语句。按照惯例,一般把这些Hive查询文件保存为具有.q或者.hql后缀名的文件。

$hive -f /path/to/file/withqueries.hql

在Hive shell中用户可以使用SOURCE命令来执行一个脚本文件。下面是一个例子:

$cat /path/to/file/withqueries.hql
SELECT x.* FROM src x
$hive
hive>source /path/to/file/withqueries.hql;

顺便说一下,如果查询中的表名和这个例子并不相关,我们有时会使用src(代表“源表”)作为表名。这个约定来源于Hive源码中的元的写法。它会在所有测试开始前先创建一个名为的表。

5、hiverc文件

我们最后将要讨论的CLI选项是-i文件名。这个选项允许用户指定一个文件,当CLI启动时,在提示符出现前会先执行这个文件。Hive会自动在HOME目录下寻找名为.hiverc的文件,而且会自动执行这个文件中的命令(如果文件中有的话)。
对于用户需要频繁执行的命令,使用这个文件是非常方便的。例如设置系统属性,或者增加对于Hadoop的分布式内存进行自定义的Hive扩展的Java包(JAR文件)。
下面的例子显示的是一个典型的$HOME/.hiverc文件中的内容:

ADD JAR /path/to/custom_hive_extensions.jar;
set hive.cli.print.current.db=true;
set hive.exec.mode.local.auto=true;

上面例子第1行表示向Hadoop分布式内存中增加一个JAR文件。第2行表示修改CLI提示符前显示当前所在的工作数据库。最后1行表示“鼓励”Hive如果可以使用本地模式执行(即使当Hadoop是以分布式模式或伪分布式模式执行时)的话就在本地执行,这样可以加快小数据集的数据查询速度。
警告
一个比较容易犯的错误就是忘记在每行的结尾加分号,如果用户犯了这个错误,那么这个属性将包含后面几行所有的文字,直到发现下一个分号。

6、使用Hive CLI的更多介绍

CLI支持其他一些有用的功能。
自动补全功能:如果用户在输人的过程中敲击Tab制表键,那么CLI会自动补全可能的关键字或者函数名。例如,如果用户输人SELE然后按Tab键,CLI将自动补全这个词为SELECT。
如果用户在提示符后面直接敲击Tab键,那么用户会看到如下回复:
hive>
Display all 407possibilities?(y or n)
警告:当向CLI中输入语句时,如果某些行是以Tab键开头的话,就会产生一个常见的令人困惑的错误·用户这时会看到一个“是否显示所有可能的情况”的提示,而且输入流后面的字符会被认为是对这个提示的回复,也因此会导致命令执行失败。

7、查看操作命令历史

用户可以使用上下箭头来滚动查看之前的命令。事实上,每一行之前的输人都是单独显示的,CLI不会把多行命令和查询作为一个单独的历史条目。Hive会将最近的10000行命令记录到文件$HOME/.hivehistory中。
如果用户想再次执行之前执行过的某条命令,只需要将光标滚动到那条记录然后按Enter键就可以了。如果用户需要修改这行记录后再执行,那么需要使用左右方向键将光标移动到需要修改的地方然后重新编辑修改就可以了。修改后用户直接敲击Enter键就可以提交这条命令而无需切换到命令尾。
提示
大多数的导航按鍵使用的contrl+字母的命令和bashshell中是相同的(例如,Control+A代表光标移到到行首,Control+B代表光标移动到行尾)。然而,类似的“元操作”Option或者Escape键就不起作用了(例如,Option+F一次向前移动一个单词这样的命令).相似地,Delete删除键会删除光标左边的字符,而ForwardDeIete回榕键不会删除掉光标当前所在的字符。

8、执行shell命令

用户不需要退出hive CLI就可以执行简单的bashshell命令。只要在命令前加上!并且分号(;)结尾就可以:
hive>!/bin/echo "what up dog"
"whatupdog"
hive>!pwd;
/home/me/hiveplay
Hive CLI中不能使用需要用户进行输人的交互式命令,而且不支持shell的“管道”功能和文件名的自动补全功能。例如,!ls *.hql;这个命令表示的是查找文件名为*.hql的文件,而不是表示显示以.hql结尾的所有文件。

9、在Hive内使用Hadoop的dfs命令

用户可以在Hive CLI中执行Hadoop的dfs…命令,只需要将hadoop命令中的关键字hadoop去掉,然后以分号结尾就可以了:
hive>dfs -ls/;
Found 3 items
drwxr-xr-x  - root supergroup   0 2011-08-17 16:27 /etl

这种使用hadoop命令的方式实际上比与其等价的在bash shell中执行的hadoop dfs..命令要更高效。因为后者每次都会启动一个新的JVM实例,而Hive会在同一个进程中执行这些命令。
用户可以通过如下命令查看dfs所提供的所有功能选项列表:
hive>dfs -help;

10、Hive脚本中如何进行注释

用户可以使用以--开头的字符串来表示注释,例如:
-- Copyright(c)2012
-- This is the best Hive script evar!!
SELECT * FROM massive_table;
CLI是不会解析这些注释行的,因此如果用户在CLI中粘贴这些注释语句,那么将会有错误信息·他们只能放在脚本中通过的方式执行。

11、显示字段名称

作为最后一个例子,我们把学到的很多东西都放在了一起。我们可以让CLI打印出字段名称(这个功能默认是关闭的)。我们可以通过设置hiveconf配置项htve.cli.print.header为true来开启这个功能:

hive>set hive.cli.print.header=true;
hive>SELECT * FROM systemIogs LIMIT3;

tstamp severity server message

。。。  。。。  。。。  。。。
如果用户希望总是看到字段名称,那么只需要将第1行添加到SHOME/.hiverc文件中即可。
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值