Python获取Hive运行结果, Hive结果赋给变量。
作者:草小诚(wellsmile@foxmail.com)
转载请注原文地址:https://blog.csdn.net/cxcjoker7894/article/details/86293182
很多时候我们在系统中自动化运行 hive job,并希望运行之后直接将 job 的运行结果拿到代码变量中(就像传统数据库那样),本文使用 python 语言的标准库 subprocess 和 shlex 实现这个功能,要优于使用 os.system 等方式。
subprocess 是什么?
subprocess 是一个 python 标准类库,用于创建进程运行系统命令,并且可以连接进程的输入输出和错误管道,获取它们的返回,使用起来要优于 os.system,在这里我们使用这个库运行 hive 语句并获取返回结果。
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 根据实际情况更改。