用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库
Posted
技术标签:
【中文标题】用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库【英文标题】:Python script for closing impala queries. I am using urllib and json libraries 【发布时间】:2018-06-18 09:29:05 【问题描述】:我正在使用 python 脚本来关闭 impala 查询。该脚本适用于字符串变量,但我无法为字符串 + 整数变量编写逻辑。 我使用的变量是 如果状态 =“已完成”或“异常” 等待=真 然后使用 urllib 关闭查询。 但是,我需要包含整数变量的帮助。整数变量类似于 15m10sec 或 15sec10ms。
下面是代码:
import urllib, json
from datetime import datetime
nodes = ["node1.com:1202", #example destination servers
"node2.com:1202",
"node3.com:1202",
]
for i, datanode in enumerate(nodes):
print("Checking : ".format(i, datanode))
try:
response = urllib.urlopen(datanode + "queries?json")
data = json.loads(response.read())
if data["num_waiting_queries"] > 0:
print(data["num_waiting_queries"])
for in_flight_query in data["in_flight_queries"]:
if in_flight_query["waiting"] is True and in_flight_query['state'] == "FINISHED" or "EXCEPTION" and in_flight_query['duration'][:2] > 15: #I have included the duration here but it not working as expected. I guess the logic is incorrect. Code works after removing 'duration'.
cancel_url = datanode + "cancel_query?query_id=".format(in_flight_query['query_id'])
print(cancel_url)
response = urllib.urlopen(cancel_url)
except IOError:
print("Skipping : ".format(i, datanode))
except Exception as e:
print(e)
json 对象:
This the json script,I want use variable "duration" from it.
"in_flight_queries": [
"effective_user": "user4",
"default_db": "testdb",
"stmt": "select * from table",
"stmt_type": "QUERY",
"start_time": "2018-06-18 01:04:12.558731000",
"end_time": "00:00:00",
"duration": "30m34s",
"progress": "16 / 30 (53.3333%)",
"state": "FINISHED",
"rows_fetched": 10,
"query_id": "7243:954ed9414b96abaf",
"last_event": "First row fetched",
"waiting": true,
"executing": false,
"waiting_time": "30m30s"
【问题讨论】:
你能说明However, I want help in including integer variable. Integer variable will be like 15m10sec or 15sec10ms
在代码中的位置吗?有点不清楚:你提到了什么变量以及15m10sec
不是整数
15m10sec 会像时间一样不断变化。
您想在代码中的什么位置包含整数时间?
在同一行if in_flight_query["waiting"] is True and in_flight_query['state'] == "FINISHED" or "EXCEPTION"
那么这个整数变量是从哪里来的,它与什么相匹配?
【参考方案1】:
根据讨论,我认为您可以使用下面的函数提取时间并稍后在if
语句中进行比较:
from datetime import datetime
def extract_seconds(text: str):
pat = '%Mm%Ss' # convenient reference: http://strftime.org/
try:
x = datetime.strptime(text, pat)
except ValueError:
raise ValueError('Cannot extract time from with '.format(x, pat))
return x.minute * 60 + x.second
assert extract_seconds('30m34s') == 1834
如果您愿意使用datetime
对象,则更短:
def extract(text: str):
pat = '%Mm%Ss' # convenient reference: http://strftime.org/
try:
return datetime.strptime(text, pat).time()
except ValueError:
raise ValueError('Cannot extract time from with '.format(x, pat))
【讨论】:
谢谢叶夫根尼。但是,这对我不起作用。我正在寻找类似in_flight_query[['duration'[2:3]]] == 'm' and in_flight_query[[int('duration'[:2])]] > 15:
的东西,但它没有按预期工作
@Michael,你不能认真对待in_flight_query[['duration'[2:3]]] == 'm' and in_flight_query[[int('duration'[:2])]] > 15:
,使用extract(in_flight_query['duration']).second > 15
。
我在使用extract(in_flight_query['duration']).second > 15
后看到以下错误name 'extract' is not defined
在你使用这个函数之前,你有没有把def extract(...
代码放在你程序的某个地方?
我没有将def extract(...
代码放在其他任何地方。以上是关于用于关闭 impala 查询的 Python 脚本。我正在使用 urllib 和 json 库的主要内容,如果未能解决你的问题,请参考以下文章
如果在 impala statestore 关闭时执行 DDL,为啥 Impala 查询会失败?
如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?