【问题标题】:List Scheduled Queries in BigQuery列出 BigQuery 中的计划查询
【发布时间】:2019-09-08 18:36:39
【问题描述】:

我需要(以编程方式)分析 BigQuery 中计划查询的详细信息(例如,更新了哪些表以及在 SQL 中访问了哪些表)。我使用 Apps 脚本 BigQuery.Tables.list() 为 BQ 表/视图做了类似的事情,但我找不到访问计划查询的 API。

UI 能够列出它们,所以我觉得这应该可以通过编程方式进行,例如通过 REST API。有谁知道这是否可行,支持什么接口(Apps Script,REST ...),以及如何使用它的示例。

【问题讨论】:

  • 仅仅因为可以在 Google 产品的 UI 中完成某些事情并不意味着 Google 会以编程方式向公众公开该功能。
  • 我确实看过 Jobs: list,但它看起来像是用于询问已出现问题但尚未开始(待定)的作业、正在运行的作业和已完成的作业.我认为它没有关于计划查询的信息......直到它被触发并成为工作

标签: google-apps-script google-bigquery


【解决方案1】:

计划查询是 BigQuery 数据传输服务的一部分,因此您必须使用其 API。特别是projects.transferConfigs.list 方法。用scheduled_query 填写dataSourceIds 字段,用projects/PROJECT_ID 填写parent。正如 cmets 中所讨论的,如果您使用的是区域位置,例如 europe-west2,而不是多区域位置(欧盟或美国),则应改用 projects.locations.transferConfigs.list。现在,父资源将采用projects/PROJECT_ID/locations/REGIONAL_LOCATION 的形式。

另外,对于其他转账,您可以使用projects.dataSources.list方法获取对应的dataSourceIds。这就是我得到scheduled_query 的方式。

响应将是一组预定查询,例如:

{
  "name": "projects/<PROJECT_NUMBER>/locations/us/transferConfigs/<TRANSFER_CONFIG_ID>",
  "destinationDatasetId": "<DATASET>",
  "displayName": "hacker-news",
  "updateTime": "2018-11-14T15:39:18.897911Z",
  "dataSourceId": "scheduled_query",
  "schedule": "every 24 hours",
  "nextRunTime": "2019-04-19T15:39:00Z",
  "params": {
    "write_disposition": "WRITE_APPEND",
    "query": "SELECT @run_time AS time,\n  title,\n  author,\n  text\nFROM `bigquery-public-data.hacker_news.stories`\nLIMIT\n  1000",
    "destination_table_name_template": "hacker_daily_news"
  },
  "state": "SUCCEEDED",
  "userId": "<USER_ID>",
  "datasetRegion": "us"
}

使用 bash 和 curl 的 API 调用示例:

#!/bin/bash

# parameter(s)
location=europe-west2

authToken="$(gcloud auth print-access-token)"
projectId=$(gcloud config get-value project 2>\dev\null)

# API call
scheduled_queries=$(curl  -H "Authorization: Bearer $authToken" \
https://bigquerydatatransfer.googleapis.com/v1/projects/$projectId/locations/$location/transferConfigs?dataSourceIds=scheduled_query)

# pretty print results
echo $scheduled_queries | python -m json.tool

【讨论】:

  • 谢谢,这看起来更有希望,使用 projects.dataSources.list 页面上的“TRY API”窗格可以得到预期的结果,包括projects/my_project/dataSources/scheduled_query 的数据源。但是,对 projects.transferConfigs.list 执行相同操作会返回空结果,但我知道 Big Query 中有几十个计划查询。认为我的理解可能仍然存在差距。
  • 最有可能的是您使用的是regional location,例如europe-west2,而不是多区域的EUUS。如果是这种情况,您应该改用projects.locations.transferConfigs.list。现在,parent 资源将是projects/PROJECT_ID/locations/REGIONAL_LOCATION
  • 哇哦,这就是我丢失的信息。我现在拥有我正在使用的 BQ 项目的所有预定查询的完整列表。非常感谢,为我节省了数小时手动(容易出错)从屏幕复制的时间!
  • 酷,很高兴能帮上忙!随时accept the answer 将问题标记为已解决。
【解决方案2】:

以上答案是使用 REST API 的绝佳答案。为了完整起见,我想包括 CLI 命令方法来解决同样的问题。我个人觉得这更适合 shell 脚本,但 YMMV。

示例:来自默认项目的计划查询列表。

bq ls --transfer_config --transfer_location=US --format=prettyjson

示例:来自默认项目的计划查询的详细信息。

bq show --format=prettyjson --transfer_config [RESOURCE_NAME]
# RESOURCE_NAME is a value you can get from the above bq ls command.

Further details can be found here.

【讨论】:

    【解决方案3】:

    这是一个 shell 脚本,如果您的任何计划查询失败,它将在 Slack 中通知您。只需集成到您现有的工作流程中(作为阻塞或非阻塞)或将其放在单独的 Cron 作业中。我使用 httpie 发送我的 HTTP 帖子,但您也可以使用 curl 或其他。此外,您还可以更改您的 HTTP 帖子以进行任何其他操作。

    请参阅link 了解传输状态对象的潜在状态

    #1/bin/bash
    
    sudo apt-get install httpie
    
    location=US
    authToken="$(gcloud auth print-access-token)"
    projectId=$(gcloud config get-value project 2>\dev\null)
    
    scheduled_queries=$(curl  -H "Authorization: Bearer $authToken" https://bigquerydatatransfer.googleapis.com/v1/projects/$projectId/locations/$location/transferConfigs?dataSourceIds=scheduled_query)
    
    # pretty print results
    echo $scheduled_queries | python -m json.tool
    
    length=$(echo "$scheduled_queries" | grep FAILED)
    if [ $length -gt 0 ]; then
        echo A SCHEDULED TRANSFER HAS FAILED
        http POST https://hooks.slack.com/services/<your slack channel> text="A SCHEDULED TRANSFER HAS FAILED: HERE IS STDOUT  >>> $scheduled_queries"
    
    else
        echo No errors in scheduled transfers
    fi
    

    如果在云之外或尚未经过身份验证的东西上运行,则需要事先进行身份验证。在上述之前使用:

    echo $PROD_KEY >> temp_json.json
    bash gcloud auth activate-service-account --key-file=temp_json.json --project=$PROJ_NAME_PROD
    

    其中 $PROD_KEY 是您尝试访问的任何内容的服务密钥。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 2023-02-02
      • 2021-12-05
      • 2022-11-23
      • 1970-01-01
      • 2021-01-28
      • 1970-01-01
      相关资源
      最近更新 更多