首先看一下hive cli工具对于变量的定义规定的几项功能:
$ bin/hive -h
usage: hive
-d,--define <key=value> Variable subsitution 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
-h <hostname> connecting to Hive Server on remote host
--hiveconf <property=value> Use value for given property
--hivevar <key=value> Variable subsitution to apply to hive
commands. e.g. --hivevar A=B
-i <filename> Initialization SQL file
-p <port> connecting to Hive Server on port number
-S,--silent Silent mode in interactive shell
-v,--verbose Verbose mode (echo executed SQL to the
console)
从上面输出可以看到,其中选项(-d,--define <key=value>),(--hiveconf <property=value>),(--hivevar <key=value>)都用于指定hive变量和属性。在cli中我们可以通过set命令修改或显示变量内容。
使用(-d,--define <key=value>)和(--hivevar <key=value>)是等价的,这两个属性都可以在cli定义用户自定义变量,并且将变量放置在hivevar命令空间内,这样和其他3种系统内置命令空间进行区分。
Hive中的变量和属性相关命令空间:
例1:
$ bin/hive --define foo=bar
hive (default)> set foo;
foo=bar
hive (default)> set hivevar:foo;
hivevar:foo=bar
hive (default)> set hivevar:foo=bar1;
hive (default)> set foo;
foo=bar1
hive (default)> set hivevar:foo;
hivevar:foo=bar1
hive (default)> set foo=bar2;
hive (default)> set foo;
foo=bar2
hive (default)> set hivevar:foo;
hivevar:foo=bar1
例2:
$ bin/hive --hivevar foo=bar
hive (default)> set foo;
foo=bar
hive (default)> set hivevar:foo;
hivevar:foo=bar
hive (default)> set hivevar:foo=bar1;
hive (default)> set foo;
foo=bar1
hive (default)> set hivevar:foo;
hivevar:foo=bar1
hive (default)> set foo=bar2;
hive (default)> set foo;
foo=bar2
hive (default)> set hivevar:foo;
hivevar:foo=bar1
通过以上两个例子可以发现,--define和--hivevar结果是等价的。
例3:--hiveconf在hive启动cli时指定参数值
$ bin/hive --hiveconf hive.cli.print.current.db=false
hive> set hive.cli.print.current.db;
hive.cli.print.current.db=false
hive> set hiveconf:hive.cli.print.current.db;
hiveconf:hive.cli.print.current.db=false
hive> set hiveconf:hive.cli.print.current.db=true;
hive (default)> set hive.cli.print.current.db=false;
hive> set hiveconf:hive.cli.print.current.db;
hiveconf:hive.cli.print.current.db=false
hive> set hive.cli.print.current.db;
hive.cli.print.current.db=false
注意:system和env变量前的system:和env:不能省略。
修改hive参数的方法:
方法一:
在Hive中,所有的默认配置都在${HIVE_HOME}/conf/hive-default.xml文件中,如果需要对默认的配置进行修改,可以创建一个hive-site.xml文件,放在${HIVE_HOME}/conf目录下。里面可以对一些配置进行个性化设定。Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。在hive-site.xml的格式如下:
1 |
<configuration> |
2 |
<property> |
3 |
<name>hive.metastore.warehouse.dir</name> |
4 |
<value>/user/hive/warehouse</value> |
5 |
<description>location of |
6 |
default database for the warehouse</description> |
7 |
</property> |
8 |
</configuration> |
方法二:
在启动Hive cli的时候进行配置,可以在命令行添加-hiveconf param=value来设定参数,例如:
1 |
$ hive --hiveconf mapreduce.job.queuename=queue1 |
这样在Hive中所有MapReduce作业都提交到队列queue1中。这一设定对本次启动的会话有效,下次启动需要重新配置。
方法三:
在已经进入cli时进行参数声明,可以在HQL中使用SET关键字设定参数,例如:
1 |
hive> set mapreduce.job.queuename=queue1; |
这样也能达到方法二的效果。这种配置也是对本次启动的会话有效,下次启动需要重新配置。
上述三种设定方式的优先级依次递增。即参数声明覆盖命令行参数,命令行参数覆盖配置文件设定。