用于关闭 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 的问题。 “查询等待关闭”

如果在 impala statestore 关闭时执行 DDL,为啥 Impala 查询会失败?

如何使用 unix shell 脚本将 impala 查询输出日志转换为变量?

Python连接Impala

ETL 选择,构建一个直接处理 SQL 查询引擎(impala)或原生数据库的 ETL? [关闭]

在 IMPALA 脚本的插入语句中使用选择查询的结果