我正在通过 pyodbc
连接到 Hive。连接成功,我可以执行我的查询。
我构建了一个进度函数来显示我提交的作业的进度,它本质上是一个进度条。但是,我看不到进度条
standalone 函数可以工作,但是当我把它放在另一个函数前面时它就不能工作了。
from time import sleep
import sys
def progress_sec(x):
for i in range(21):
sys.stdout.write('\r')
sys.stdout.write("[%-20s] %d%%" % ('='*i, 5*i))
sys.stdout.flush()
sleep(0.25)
return
上面的函数是我的进度条函数,我想把它放在前面:
df_hotels = progress_sec(pd.read_sql(sql, con))
sql
和 con
均已定义并正常工作。
我想要一个进度条来显示 df_hotels
行开始执行的进度,但我无法让它工作。
最佳答案
pandas 的 read_sql
是一个阻塞调用。一旦通过调用启动查询,程序将无法在查询返回之前运行。
您可以尝试通过启动多个线程(一个用于 pandas 调用,另一个用于进度条)来解决此问题,但我无法确认这是否有效。
您可以更进一步,在单独的进程中运行查询,例如 @SyntaxVoid suggested ,但您仍然无法获取执行进度。
如果你真的想跟踪 Hive 查询的进度,你可能想放弃 pandas
和 pyodbc
,并使用专用接口(interface),如 PyHive ;以下内容摘自其自述文件:
cursor.execute('SELECT * FROM my_awesome_data LIMIT 10', async=True)
status = cursor.poll().operationState
while status in (TOperationState.INITIALIZED_STATE, TOperationState.RUNNING_STATE):
logs = cursor.fetch_logs()
for message in logs:
print message
# If needed, an asynchronous query can be cancelled at any time with:
# cursor.cancel()
status = cursor.poll().operationState
print cursor.fetchall()
关于python - 显示 Hive 查询的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57417274/