Python使用subprocess和shlex获取Hive运行结果

Python获取Hive运行结果, Hive结果赋给变量。

作者:草小诚(wellsmile@foxmail.com)
转载请注原文地址:https://blog.csdn.net/cxcjoker7894/article/details/86293182

很多时候我们在系统中自动化运行 hive job,并希望运行之后直接将 job 的运行结果拿到代码变量中(就像传统数据库那样),本文使用 python 语言的标准库 subprocess 和 shlex 实现这个功能,要优于使用 os.system 等方式

subprocess 是什么?

点击:【官方文档对 subprocess 的介绍】

subprocess 是一个 python 标准类库,用于创建进程运行系统命令,并且可以连接进程的输入输出和错误管道,获取它们的返回,使用起来要优于 os.system,在这里我们使用这个库运行 hive 语句并获取返回结果。

shlex 是什么?

点击:【官方文档对 shlex 的介绍】

shlex 是一个 python 标准类库,使用这个类我们可以轻松的做出对 linux shell 的词法分析,在这里我们将格式化好的 hive 连接语句用 shlex 切分,配合 subprocess.run 使用。

使用 beeline 连接 Hive

在运行之前先要连接hive,有多种不同的方式,本文使用 beeline 连接 hiveserver 的方式,这也是各大云服务商EMR产品的主流连接Hive的方式。

'''
参数说明:
HIVE_HOSTNAME:hive所在主机或ip
HIVE_PORT:hiveserver端口号
HIVE_DATABASE_NAME:要连接的Hive库名
BEELINE_COMMAND_PATH:为了稳妥,这里传入beeline命令的绝对路径
'''
hive_url = 'jdbc:hive2://{!s}:{!s}/{!s}'.format(HIVE_HOSTNAME, HIVE_PORT, HIVE_DATABASE_NAME)
beeline_tempalte = BEELINE_COMMAND_PATH + ' -u {!s} -n hadoop --outputformat=tsv2 --showHeader=false -e {!r}'
sql = 'select * from example_table_name;'
cmd_rendered = beeline_tempalte.format(hive_url, sql) # 渲染后,最终要执行的语句

提交Job并获取结果

接下来可以提交job,等待运行结束后,获取结果,此段代码通用。

import shlex
import subprocess

timeout = 86400 # 任务的超时限制,秒数
args = shlex.split(cmd_rendered) # 使用 shlex 切分语句
# 使用 subprocess 执行语句
complted_process = subprocess.run(args, 
                           stdout=subprocess.PIPE, 
                           stderr=subprocess.PIPE,
                           timeout=timeout)
# 如果执行成功,获取输出管道中的返回的结果
if complted_process.returncode == 0:
	# returned_data 是一个 list,每一个元素是 hive 运行结果的一行,不含表头
	returned_data = complted_process.stdout.decode('utf-8').strip().split('\n')
	print(returned_data)
# 如果失败,就输出错误管道中的错误信息
else:
	print(complted_process.stderr)

大功告成

如此,returned_data 已经按行获取到了 Hive Job 的运行结果,不含其它噪音输出,并且可以根据 returncode 优雅的判断执行是否成功,对于每一行数据,可以通过 split(’\t’) 获取其中每一列的值,以 list 的形式进行处理或转存,完美的实现了业务的要求。

连接 hive 的语句 cmd_rendered 根据实际情况更改。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值