美文网首页hive
利用Python替换Hive查询语句中的变量

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

作者: 赤兔在云端 | 来源:发表于2018-03-07 14:08 被阅读296次

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

    相关文章

      网友评论

        本文标题:利用Python替换Hive查询语句中的变量

        本文链接:https://www.haomeiwen.com/subject/rftjfftx.html