【问题标题】:How do I get the metadata for a BigQuery query through the HTTP api如何通过 HTTP api 获取 BigQuery 查询的元数据
【发布时间】:2017-04-06 16:45:33
【问题描述】:

我正在为 F# 开发一个类型提供程序,为了实现它,我们需要获取查询编译时的架构,这意味着它必须很快。截至目前,我们运行的是这样的:

bq query --format=json --dry_run=true --use_legacy_sql=false 'SELECT @a IS TRUE AS x, @b + 1 AS y, "foo" = @c AS z, ["tomas", "jansson"] as w, STRUCT("wat" as t, 69 as u) as v, [STRUCT(3, "allo" as g), STRUCT(5 as a, "yolo")] as u, STRUCT(["a"] as h) as t;'

这正是我们想要的,但它使用了bq 工具。我想知道在代码库中找不到的底层 http 调用是什么。

我想了解底层代码库的原因是因为我想尽可能多地删除第三方依赖项,这些依赖项可能在构建服务器上不可用或需要很长时间设置。

【问题讨论】:

  • 查看bq 工具进行的底层http API 调用的一个好技巧是使用api 标志。例如:bq query --apilog=true --format=json --dry_run=true --use_legacy_sql=false 'SELECT count(*) FROM lookerdata:cdc.project_tycho_reports;'查看所有标志运行bq --help | grep "\--api"

标签: google-bigquery


【解决方案1】:

或者你可以使用

Jobs: insertquery 配置属性和 dryRun 设置为 true

【讨论】:

    【解决方案2】:

    编辑:米哈伊尔是对的;只有jobs.insert API 提供架构信息。我将使用这个答案来记录当前的行为。

    使用jobs.insert API,这是一个示例请求和响应:

    PROJECT="YOUR_PROJECT_NAME"
    QUERY="\"SELECT 1 AS x, 'foo' AS y, @b IS FALSE AS z;\""
    REQUEST="{\"configuration\":{\"dryRun\":true,\"query\":{\"useLegacySql\":false,\"query\":${QUERY}}}}"
    echo $REQUEST | \
    curl -X POST -d @- -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://www.googleapis.com/bigquery/v2/projects/$PROJECT/jobs
    
    (some parts omitted)
    "statistics": {
     "query": {
      "schema": {
       "fields": [
        {
         "name": "x",
         "type": "INTEGER",
         "mode": "NULLABLE"
        },
        {
         "name": "y",
         "type": "STRING",
         "mode": "NULLABLE"
        },
        {
         "name": "z",
         "type": "BOOLEAN",
         "mode": "NULLABLE"
        }
       ]
      },
      "undeclaredQueryParameters": [
       {
        "name": "b",
        "parameterType": {
         "type": "BOOL"
        }
       }
      ],
      "statementType": "SELECT"
     }
    

    这里是一个使用jobs.query的示例请求和响应,为了比较:

    PROJECT="YOUR_PROJECT_NAME"
    QUERY="\"SELECT 1 AS x, 'foo' AS y, @b IS FALSE AS z;\""
    REQUEST="{\"kind\":\"bigquery#queryRequest\",\"dryRun\":true,\"useLegacySql\":false,\"query\":$QUERY}"
    echo $REQUEST | \
      curl -X POST -d @- -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        https://www.googleapis.com/bigquery/v2/projects/$PROJECT/queries
    
    {
     "kind": "bigquery#queryResponse",
     "jobReference": {
      "projectId": "<omitted>"
     },
     "totalBytesProcessed": "0",
     "jobComplete": true,
     "cacheHit": false
    }
    

    【讨论】:

    • 谢谢。我明天第一件事再试一次。我早些时候尝试过试运行,但只得到了一个数字而不是模式。可能做错了什么。
    • 看起来我在使用 try run 时没有得到架构。我得到的数据是:{ "kind": "bigquery#queryResponse", "jobReference": { "projectId": "uc-prox-development" }, "totalBytesProcessed": "0", "jobComplete": true, "cacheHit": false } 在这个页面上尝试了 API:cloud.google.com/bigquery/docs/reference/rest/v2/jobs/…
    • 另一个答案虽然可行,但是当直接进入查询 API 而不是作业时,应该更新 API 以包含架构。
    • 我更新了答案以显示 insertquery API 之间的响应差异。您可以考虑提交feature request 以使query API 也返回架构信息。谢谢!
    • 在 BigQuery 中报告了一个问题,以便您可以跟踪它:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 2016-02-05
    • 2020-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多