• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

hive传递参数变量方法

Sql admin 2年前 (2017-09-20) 2775次浏览 0个评论 扫描二维码

最近写的脚本都需要向 hive 中传递相关参数,所以搜集一下网上的资料备注一下,也顺便学习一下。

使用 Hive 编写程序最常用的方法是将 Hive 语句写到文件中,然后使用 hive -f filename.hql 来批量执行查询语句。经常需要将外部参数传入到 hql 语句中替换其中的变量来动态执行任务,比如动态设定数据库名、表名、时间值、字段序列等变量,以达到脚本泛化执行的目的。

1) 方法 1:字符串、正则、模板引擎等暴力方式替换

最简单也最暴力的方式,是在 hql 文件中设定{table_name}这样的变量占位符,然后使用调度程序比如 shell、python、java 语言读取整个 hql 文件到一个字符串,替换其中的变量。然后使用 hive -e cmd_str 来执行该 Hive 命令字符串。举例代码如表格 1 和表格 2 所示。

表格 1 hive ql 文件内容

use test;

select * from student limit {limit_count};

表格 2 Python 脚本读取、替换和执行 Hive 程序

import os

#step1: 读取 query.ql 整个文件的内容

ql_source=open(“query.ql”,”r”).read()

#step2:替换其中的占位符变量

ql_target=ql_source.replace(“{limit_count}”,”10″)

#step3:使用 hive -e 的方法执行替换后的 Hql 语句序列

os.system(“hive -e ‘%s’”%ql_target)

2) 方法 2:使用系统变量或者环境变量

通常情况是使用 shell 来调度执行 hive 程序的,Hive 提供了可以直接读取系统 env 和 system 变量的方法,如表格 3 所示。

表格 3 使用 env 和 system 读取外部环境变量

use test;

–使用${env:varname}的方法读取 shell 中 export 的变量

select * from student limit ${env:g_limit_count};

–使用${system:varname}的方法读取系统的变量

select ${system:HOME} as my_home from student;

这种方式比较好,比如在 shell 中可以配置整个项目的各种路径变量,hive 程序中使用 env 就可以直接读取这些配置了。

3) 方法 3:在执行 Hive 命令时传入 hivevar 和 hiveconf

第 3 中方法是在用 hive 命令执行 hive 程序时传递命令行参数,使用-hivevar 和-hiveconf 两种参数选项给该次执行传入外部变量,其中 hivevar 是专门提供给用户自定义变量的,而 hiveconf 则包括了 hive-site.xml 中配置的 hive 全局变量。

表格 4 hivevar 和 hiveconf 传递变量的方法

hive -hivevar -f filehive -hivevar tbname=’a’ -hivevar count=10 -f filename.hql
hive -hivevar -e cmdhive -hivevar tbname=’a’ -hivevar count=10 -e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’
hive -hiveconf -f filehive -hiveconf tbname=’a’ – hiveconf count=10 -f filename.hql
hive -hiveconf -e cmdhive -hiveconf tbname=’a’ -hiveconf count=10 -e ‘select * from ${hivevar:tbname} limit ${hivevar:count}’

最经常使用的是 env 和-hivevar 方法,前者直接在 Hive 脚本中读取 shell export 的变量,后者则对脚本的当前执行进行参数设置。

转载自 http://www.crazyant.net/1451.html


Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hive 传递参数变量方法
喜欢 (0)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!