利用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查询语句中的变量