向Hive中传入变量的方式

Posted sx66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向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 ‘	‘
LINES TERMINATED BY ‘
‘
STORED AS TEXTFILE;
 
LOAD DATA LOCAL INPATH
‘/home/users/root/testdata_student‘
INTO TABLE student;
  • 测试数据
1 name1 21 20130901
2 name2 22 20130901
3 name3 23 20130901
4 name4 24 20130901
5 name5 25 20130902
6 name6 26 20130902
7 name7 27 20130902
8 name8 28 20130902
9 name9 29 20130903
10 name10 30 20130903
11 name11 31 20130903
12 name12 32 20130904
13 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;

以上是关于向Hive中传入变量的方式的主要内容,如果未能解决你的问题,请参考以下文章

.hive命令的3种调用方式 以及源码

有没有办法使用相同的布局动态创建片段并向它们显示数据?

使用hive -f 向sql文件中传变量

append() 在这个代码片段中是如何工作的?与特定变量混淆[重复]

如何向Hive表加载数据

javaz中向方法中传入变量,数据有的发生改变有的没有改变的原因