我想知道是否可以在消息發生時將消息從Hive CLI刷新到stderr。目前,我試圖執行多級查詢(只是一個樣本並非實際):在Python中將多階段作業的HIVE刷新錯誤轉換爲stderr
SELECT COUNT(*) FROM (
SELECT user from users
where datetime = 05-10-2013
UNION ALL
SELECT user from users
where datetime = 05-10-2013
) a
這將啓動3個項目,但如果作業1失敗,因爲它被殺死了,我不想跑作業2.目前我的代碼如下所示,但是,除非所有子查詢完成,否則配置單元不會寫入stderr,然後返回錯誤。
def execute_hive_query(query):
return_code = None
cmd = ["hive", "-e", query]
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
while return_code is None:
out = proc.stdout.read()
error = proc.stderr.read()
handle_hive_exception(out,error)
time.sleep(10)
return_code = proc.poll()
def handle_hive_exception(stdout,stderr):
if stderr != '':
raise Exception(stderr)
謝謝!
'.stdout.read()'會阻塞,直到子進程關閉通常在子進程退出時發生的stdout。您需要使用[threads或select.select或fctnl等](http://stackoverflow.com/q/375427/4279)實現的非阻塞式讀取。另外,你可能會遇到[block buffering issue](http://stackoverflow.com/a/12471855/4279)。 – jfs