代码之家  ›  专栏  ›  技术社区  ›  CustardBun

是否有方法通过Redshift数据API以编程方式获取查询运行的Redshift总数据扫描度量?

  •  0
  • CustardBun  · 技术社区  · 3 年前

    我的团队有一个Lambda,它可以触发从我们的Redshift集群运行的各种查询。

    我可以在控制台中通过选择查询执行来评估查询,它显示了各种指标,但我特别感兴趣的是用于报告目的的“扫描的总数据”: enter image description here

    我们已经根据来自的响应,从我的Lambda中为每个查询类型发出了一些度量 Describe Statement Redshift Data API的,但它只返回“结果行”和“结果大小”,而不返回有关扫描数据的信息。虽然这些片段也很有用,但我们也需要跟踪扫描的总数据,因为这将帮助我们进行故障排除。

    是否有类似的方法以编程方式获取这些数据扫描信息?看起来可能有一个表可以查询信息,但我希望我们可以以某种方式直接从API获取数据。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Piyush Patil    3 年前

    您可以使用boto3 SDK,这是亚马逊的Python SDK,以编程方式运行针对Redshift的SQL查询并获取结果。

    下面的示例代码

    import boto3
    
    # Initialize Redshift client
    client = boto3.client('redshift-data')
    
    # SQL command
    sql_command = """
    SELECT query, SUM(bytes) AS total_bytes_scanned
    FROM svl_query_report
    WHERE query = [Your_Query_ID]
    GROUP BY query;
    """
    
    # Execute SQL command
    response = client.execute_statement(
        ClusterIdentifier='your-redshift-cluster-id',
        Database='your-database-name',
        DbUser='your-db-username',
        Sql=sql_command,
        SecretArn='arn-of-your-secret-for-credentials'
    )
    
    # Fetch query execution status and results
    query_id = response['Id']
    status = None
    
    while status not in ('FINISHED', 'FAILED', 'CANCELLED'):
        response_desc = client.describe_statement(Id=query_id)
        status = response_desc['Status']
    
    if status == 'FINISHED':
        results = client.get_statement_result(Id=query_id)
        for record in results['Records']:
            print(record)
    

    替换占位符,如您的红移集群id、数据库名称、数据库用户名[your_Query_id],并使用适当的值了解凭据的机密。

    确保您已为boto3正确设置了AWS凭据。您可以使用AWS CLI、环境变量或IAM角色(如果在EC2实例或Lambda函数上运行)来执行此操作。