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;
  • 测试数据
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中传入变量的方式的更多相关文章

  1. MyBatis mapper文件中的变量引用方式#{}与${}的差别

    MyBatis mapper文件中的变量引用方式#{}与${}的差别 #{},和 ${}传参的区别如下:使用#传入参数是,sql语句解析是会加上"",当成字符串来解析,这样相比于$ ...

  2. ][mybatis]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转自https://blog.csdn.net/szwangdf/article/details/26714603 MyBatis mapper文件中的变量引用方式#{}与${}的差别 默认情况下,使 ...

  3. Spring中使用变量${}的方式进行参数配置

    在使用Spring时,有些情况下,在配置文件中,需要使用变量的方式来配置bean相关属性信息,比如下面的数据库的连接使用了${}的方式进行配置,如下所示: <bean id="data ...

  4. springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是field_name=@field_value@. 两个@符号是springboot为替代${}属性占位符产生,原因是${}会被maven处理,所以应该是起不到引用变量的作用. @@ ...

  5. Hive 中的变量

    Hive的变量前面有一个命名空间,包括三个hiveconf,system,env,还有一个hivevar hiveconf的命名空间指的是hive-site.xml下面的配置变量值. system的命 ...

  6. [转载]MyBatis mapper文件中的变量引用方式#{}与${}的差别

    转载自:http://blog.csdn.net/szwangdf/article/details/26714603 默认情况下,使用#{}语法,MyBatis会产生PreparedStatement ...

  7. JavaScript 中 申明变量的方式--let 语句

    let 语句 - 声明一个块范围变量. 语法 let 变量名 = 初始化值; 例子 "use strict"; let name = '赵敏'; (function opt(){ ...

  8. 向Hive中导入数据的方式

    一.Hive客户端:根据数据源不同划分 1.从本地文件系统中导入数据到hive表中: load data local inpath "path" [OVERWRITE] into ...

  9. Hive开发中使用变量的两种方法

    在使用hive开发数据分析代码时,经常会遇到需要改变运行参数的情况,比如select语句中对日期字段值的设定,可能不同时间想要看不同日期的数据,这就需要能动态改变日期的值.如果开发量较大.参数多的话, ...

随机推荐

  1. SQL注入攻击浅谈

    原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...

  2. 迈克尔·乔丹:几百年内AI不会觉醒

    ​​ 此乔丹非飞人乔丹.他是研究统计学和计算机科学家,目前研究的领域正是普通人所说的人工智能.权威的学术搜索引擎Semantic Scholar在2105年做了一项排名,关于计算机科学领域谁最具影响力 ...

  3. 银行储蓄程序(C++,simple)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  4. 小程序中,设置Sticky定位,距离上面会有一个缝隙

    近日,在小程序中使用sticky定位实现吸顶效果,不料入了一个大坑. 定位后,距离有position: relative:的上级元素有个1px大小的缝隙条,透过缝隙,滑动时可看到定位标题下的内容. 此 ...

  5. sql -- 获取连续签到的用户列表

    签到表: 需求:统计连续签到的 用户 1.根据用户和日期分组 select user_name, sign_date from user_sign group by user_name, sign_d ...

  6. 一起了解 .Net Foundation 项目 No.11

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Microsoft Web ...

  7. WinPcap vs Npcap

    1.两者都一直有人在维护,而并不是nmap官网介绍的已经停止维护了,https://nmap.org/npcap/vs-winpcap.html 2.Wireshark默认使用WinPcap,他无法抓 ...

  8. Redis系列二 - 数据结构

    前言 redis作为我们开发的一大神器,我们接触肯定不会少,但是很多同学也许只会存储String类型的值,这是非常不合理的.在这里,将带大家认识Redis的5中数据结构. 1.问:Redis有那些数据 ...

  9. GPS信号模拟器信号发生器应用介绍

    GPS信号模拟器信号发生器应用介绍 随着近些年的科学技术不断发展,卫星导航技术也在日益发展和成熟,并在不同领域得到广泛的应用.尤其在导航定位接收机的研制测试阶段,就需要GPS信号模拟器来模拟不同环境和 ...

  10. 基于微信小程序的租房小程序

    乐直租全国租房小程序前端 房源分钟上传,可快捷联系房东的小程序. 该小程序操作简单,布局清新,欢迎 start ~ 传送门:Github 扫码体验: pages: 首页 index 选择发布页 bef ...