利用Python替换Hive查询语句中的变量

Hive查询语句可以看作一个较长的字符串,因此可以用字符串替换函数来修改成其他查询语句。使用Python等编程工具做这件事情的思路是:

  • 编写hive查询语句时用特殊的字符串命名变量
  • 读取整个查询语句为字符串
  • 使用字符串替换函数修改变量部分的字符串
  • 把修改后的字符串变成执行语句
一、查询语句中预留变量

例如,原始查询语句文件 hivequery.sql 的内容如下:

SELECT * FROM t1
WHERE students = 'Zhang'
AND subjects = {var_subject};

其中{var_month}就是给变量预留的”占位符”,它其实并不是变量,只是我们做的字符串标记以便查找替换。写上大括号是为了和shell或者hive的定义变量很像,其实这部分可以是任意的字符串,比如$var_sub、hello_subject等等,只要我们能理解并且机器能准确匹配就行。

二、读取查询语句
testsql = open("hivequery.sql","r").read()

其实我们的目的是读取查询语句为字符串,那个sql文件并没有什么意义,并不能用来查询。所以原文件是txt等类型的也可以,或者直接在python脚本中写下查询语句都是可以的,比如:

testsql = '''
SELECT * FROM t1
WHERE students = 'Zhang'
AND subjects = {var_subject};
'''

是否有换行不会对最后的查询执行产生影响。

三、字符串变量替换

将变量部分的字符串替换即可:

testsql = testsql.replace("{var_subject}", "'Math'")

注意’Math’的单引号不能少,后面会有说明。

四、执行查询语句

如果查询语句是字符串,需要用到hive的-e参数,后接查询字符串,例如:
hive -e “select * from t1 limit 10”
在python中执行这样的命令,需要调用标准库os:
(除了os.system还有其他方式执行,这里就不展开了)

import os
os.system('hive -e "%s"'%testsql)
#或者采用format
os.system('hive -e "{}"'.format(testsql))

特别需要注意的是单双引号嵌套使用的问题,在上面的例子最后生成的是一大串字符串,最里层的查询语句testsql使用了单引号(如students = ‘Zhang’),所以第二层hive -e 后面的字符串使用的是双引号(”%s”,”{}”),最外层整体的字符串就使用了单引号(’hive -e “%s”‘)。如果用错了单双引号,运行可能会报错,或者使查询条件有问题而查错结果。

最后,把以上的代码整理到一个文件pyquery.py中:

import os
testsql = open("hivequery.sql","r").read()
testsql = testsql.replace("{var_subject}", "'Math'")
os.system('hive -e "{}"'.format(testsql))

然后执行该文件就能查询了,如果是Linux环境,运行python pyquery.py即可。
其他替换变量的方法:
在hive查询中使用变量
利用shell脚本设置hive查询语句中的变量

    原文作者:赤兔在云端
    原文地址: https://www.jianshu.com/p/b5a2ffffc75f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞