利用Python替換Hive查詢語(yǔ)句中的變量

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ǔ)句中的變量

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诺苹,一起剝皮案震驚了整個(gè)濱河市雹拄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌筹淫,老刑警劉巖呢撞,帶你破解...
    沈念sama閱讀 211,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件殊霞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡棒卷,警方通過查閱死者的電腦和手機(jī)祝钢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,347評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門拦英,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疤估,你說我怎么就攤上這事霎冯∩蜃玻” “怎么了雕什?”我有些...
    開封第一講書人閱讀 157,435評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)晋修。 經(jīng)常有香客問我凰盔,道長(zhǎng),這世上最難降的妖魔是什么落剪? 我笑而不...
    開封第一講書人閱讀 56,509評(píng)論 1 284
  • 正文 為了忘掉前任忠怖,我火速辦了婚禮抄瑟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鞋拟。我一直安慰自己惹资,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,611評(píng)論 6 386
  • 文/花漫 我一把揭開白布猴誊。 她就那樣靜靜地躺著懈叹,像睡著了一般分扎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上环揽,一...
    開封第一講書人閱讀 49,837評(píng)論 1 290
  • 那天庵佣,我揣著相機(jī)與錄音,去河邊找鬼通今。 笑死肛根,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的臼氨。 我是一名探鬼主播芭届,決...
    沈念sama閱讀 38,987評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼持隧!你這毒婦竟也來了逃片?” 一聲冷哼從身側(cè)響起褥实,我...
    開封第一講書人閱讀 37,730評(píng)論 0 267
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赠潦,沒想到半個(gè)月后草冈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,194評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡怎棱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,525評(píng)論 2 327
  • 正文 我和宋清朗相戀三年哩俭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拳恋。...
    茶點(diǎn)故事閱讀 38,664評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凡资,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隙赁,我是刑警寧澤垦藏,帶...
    沈念sama閱讀 34,334評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站伞访,受9級(jí)特大地震影響掂骏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厚掷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,944評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冒黑。 院中可真熱鬧田绑,春花似錦、人聲如沸抡爹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,764評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)豁延。三九已至昙篙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诱咏,已是汗流浹背苔可。 一陣腳步聲響...
    開封第一講書人閱讀 31,997評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留袋狞,地道東北人焚辅。 一個(gè)月前我還...
    沈念sama閱讀 46,389評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像苟鸯,于是被迫代替她去往敵國(guó)和親同蜻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,554評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容