Hive查詢語(yǔ)句可以看作一個(gè)較長(zhǎng)的字符串,因此可以用字符串替換函數(shù)來修改成其他查詢語(yǔ)句圆丹。使用Python等編程工具做這件事情的思路是:
- 編寫hive查詢語(yǔ)句時(shí)用特殊的字符串命名變量
- 讀取整個(gè)查詢語(yǔ)句為字符串
- 使用字符串替換函數(shù)修改變量部分的字符串
- 把修改后的字符串變成執(zhí)行語(yǔ)句
一躯喇、查詢語(yǔ)句中預(yù)留變量
例如,原始查詢語(yǔ)句文件 hivequery.sql 的內(nèi)容如下:
SELECT * FROM t1
WHERE students = 'Zhang'
AND subjects = {var_subject};
其中{var_month}就是給變量預(yù)留的"占位符"倦微,它其實(shí)并不是變量正压,只是我們做的字符串標(biāo)記以便查找替換。寫上大括號(hào)是為了和shell或者h(yuǎn)ive的定義變量很像拓劝,其實(shí)這部分可以是任意的字符串嘉裤,比如$var_sub、hello_subject等等厢洞,只要我們能理解并且機(jī)器能準(zhǔn)確匹配就行典奉。
二、讀取查詢語(yǔ)句
testsql = open("hivequery.sql","r").read()
其實(shí)我們的目的是讀取查詢語(yǔ)句為字符串公你,那個(gè)sql文件并沒有什么意義假瞬,并不能用來查詢迂尝。所以原文件是txt等類型的也可以懦傍,或者直接在python腳本中寫下查詢語(yǔ)句都是可以的粗俱,比如:
testsql = '''
SELECT * FROM t1
WHERE students = 'Zhang'
AND subjects = {var_subject};
'''
是否有換行不會(huì)對(duì)最后的查詢執(zhí)行產(chǎn)生影響。
三寸认、字符串變量替換
將變量部分的字符串替換即可:
testsql = testsql.replace("{var_subject}", "'Math'")
注意'Math'的單引號(hào)不能少偏塞,后面會(huì)有說明。
四灸叼、執(zhí)行查詢語(yǔ)句
如果查詢語(yǔ)句是字符串古今,需要用到hive的-e參數(shù),后接查詢字符串捉腥,例如:
hive -e "select * from t1 limit 10"
在python中執(zhí)行這樣的命令抵碟,需要調(diào)用標(biāo)準(zhǔn)庫(kù)os:
(除了os.system還有其他方式執(zhí)行,這里就不展開了)
import os
os.system('hive -e "%s"'%testsql)
#或者采用format
os.system('hive -e "{}"'.format(testsql))
特別需要注意的是單雙引號(hào)嵌套使用的問題撬统,在上面的例子最后生成的是一大串字符串唱歧,最里層的查詢語(yǔ)句testsql使用了單引號(hào)(如students = 'Zhang'),所以第二層hive -e 后面的字符串使用的是雙引號(hào)("%s","{}")蕊苗,最外層整體的字符串就使用了單引號(hào)('hive -e "%s"')朽砰。如果用錯(cuò)了單雙引號(hào)喉刘,運(yùn)行可能會(huì)報(bào)錯(cuò)漆弄,或者使查詢條件有問題而查錯(cuò)結(jié)果。
最后廉邑,把以上的代碼整理到一個(gè)文件pyquery.py中:
import os
testsql = open("hivequery.sql","r").read()
testsql = testsql.replace("{var_subject}", "'Math'")
os.system('hive -e "{}"'.format(testsql))
然后執(zhí)行該文件就能查詢了倒谷,如果是Linux環(huán)境,運(yùn)行python pyquery.py即可牵祟。
其他替換變量的方法:
在hive查詢中使用變量
利用shell腳本設(shè)置hive查詢語(yǔ)句中的變量