向Hive中传入变量的方式
Hive向程序中传递变量的方式
- 暴力替换
- 字符串替换
- 正则替换
- 模板引擎
- 系统环境变量
- shell环境变量:${env:varname}
- system系统变量:${system:varname}
- hive 命令参数
- hivevar方式:${hivevar:varname}
- hiveconf方式:${hiveconf:varname}
hive接收外部变量方式详解
- 使用Hive编写程序最常用的方法是将Hive语句写到文件中,然后使用hive -f filename.hql来批量执行查询语句。经常需要将外部参数传入到hql语句中替换其中的变量来动态执行任务,比如动态设定数据库名、表名、时间值、字段序列等变量,以达到脚本泛化执行的目的。
- 在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值。如果开发量较大、参数多的话,使用变量来替代原来的字面值非常有必要,对传入的方式进行总结。
数据准备
- hive 表中创建数据
use test; ---学生信息表 create table IF NOT EXISTS student( sno bigint comment ‘学号‘ , sname string comment ‘姓名‘ , sage bigint comment ‘年龄‘ , pdate string comment ‘入学日期‘ ) COMMENT ‘学生信息表‘ ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t‘ LINES TERMINATED BY ‘\n‘ STORED AS TEXTFILE; LOAD DATA LOCAL INPATH ‘/home/users/root/testdata_student‘ INTO TABLE student;
- 测试数据
name1 21 20130901 name2 22 20130901 name3 23 20130901 name4 24 20130901 name5 25 20130902 name6 26 20130902 name7 27 20130902 name8 28 20130902 name9 29 20130903 name10 30 20130903 name11 31 20130903 name12 32 20130904 name13 33 20130904
1-shell中设置变量,hive -e中直接使用
- 测试脚本
#!/bin/bash tablename="student" limitcount="8" hive -S -e "use test; select * from ${tablename} limit ${limitcount};"
- 可以正常运行
- 由于hive自身是类SQL语言,缺乏shell的灵活性和对过程的控制能力,所以采用shell+hive的开发模式非常常见,在shell中直接定义变量,在hive -e语句中就可以直接引用;
注意
- 注意:使用 hiveconf 定义,在hive -e中是不能使用的
- 修改一下刚才的shell文件,采用-hiveconf的方法定义日期参数:
#!/bin/bash tablename="student" limitcount="8" hive -S -hiveconf enter_school_date="20130902" -hiveconf min_age="26" -e " use test; select * from ${tablename} where pdate=‘${hiveconf:enter_school_date}‘ and sage>‘${hiveconf:min_age}‘ limit ${limitcount};"
- 运行会失败,因为该脚本在shell环境中运行的,于是shell试图去解析{hiveconf:enter_school_date}和${hiveconf:min_age}变量,但是这两个SHELL变量并没有定义,所以会以空字符串放在这个位置。
方法2:使用-hiveconf定义,在SQL文件中使用
- 因为换行什么的很不方便,hive -e只适合写少量的SQL代码,所以一般都会写很多hql文件,然后使用hive –f 的方法来调用,这时候可以通过-hiveconf定义一些变量,然后在SQL中直接使用。
- 先编写shell文件
#!/bin/bash hive -hiveconf enter_school_date="20130902" -hiveconf min_ag="26" -f testvar.sql
- 被调用脚本
use test; select * from student where pdate=‘${hiveconf:enter_school_date}‘ and sage > ‘${hiveconf:min_ag}‘ limit 8;
方法3:使用hivevar,再sql文件中使用
- 再hql脚本中写使用set hivevar:varname的方式
- 定义脚本
#!/bin/bash hive -f testvar.sql
- sql脚本
use test; set hivevar:center_school_date="20130920"; set hivevar:min_age="26"; select * from student where pdate=‘${hivevar:enter_school_date}‘ and sage > ‘${hivevar:min_ag}‘ limit 8;
相关推荐
archive 2020-07-30
成长之路 2020-07-28
eternityzzy 2020-07-19
taisenki 2020-07-05
tugangkai 2020-07-05
SignalDu 2020-07-05
zlsdmx 2020-07-05
tomson 2020-07-05
tugangkai 2020-07-04
tomson 2020-07-05
Zhangdragonfly 2020-06-28
genshengxiao 2020-06-26
成长之路 2020-06-26
tomson 2020-06-26
蜗牛之窝 2020-06-26
成长之路 2020-06-25