hive脚本的三种执行方式
1. hive控制台交互式执行;
2. hive -e "SQL"执行;或者 hive -S -e " sql" ,加了-S表示静音模式,即不会显示mapreduce的操作过程。
这种方式直接在bash shell终端里边输入 hive -e "SQL"执行即可,不需要进入hive交互式界面,并且hql语句可以用单引号或者双引号括起来都行,语句末尾可以没有;号,但是我的hive1.2.2版本要求引号里边的hql必须在from的表名称前加上所在数据库前缀,否则抛出SemanticException [Error 10001]: Line 1:22 Table not found 'table_name'错误。
此处还有一亮点,利用输出定向将查询结果导出到linux本地目录下。例如:
[[email protected] shell]$ hive -e 'select * from t1' > test.txt
3. hive [-S]-f SQL文件执行;
不进入交互模式,执行sql文件中的sql脚本,可以和静音模式-S联合使用,通过第三方程序调用,第三方程序通过hive的标准输出获取结果集,使用场景是自动化报表等。
例如:
$HIVE_HOME/bin/ hive -S -f /home/my/hive-script.sql (不会显示mapreduct的操作过程).
那么问题来了:如何传递参数呢?
假设pms_exps_prepro.sql文件内容如下:
set mapred.job.queue.name=pms; #这里的set是在设置配置变量。具体见文末附表。
set hive.exec.reducers.max=48;
set mapred.reduce.tasks=48;
set mapred.job.name=[HQL]pms_exps_prepro;
drop table if exists pms.pms_exps_prepro;
create table pms.pms_exps_prepro as
select
a.provinceid,
a.cityid,
a.ieversion,
a.platform,
'${date}' as ds
from track_exps a;
上述文件中的sql脚本接收一个日期,接收参数写法类似${date},执行时如下执行:
date=2015-10-22
hive -f pms_exps_prepro.sql --hivevar date=$date
附表: