在会话中运行查询

本文档介绍如何在 BigQuery 会话中运行查询。它面向已经大致了解会话、已经创建会话并且知道要使用的会话的 ID 的用户。

在完成以下步骤之前,请确保您拥有创建会话所需的权限

在会话中运行查询

创建会话后,您可以向会话添加查询并运行该查询。您可以通过以下几种方式执行此操作:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 点击包含该会话的编辑器标签页。

  3. 将查询添加到会话,然后点击运行

测试您的会话

在 Google Cloud 控制台中,打开包含您创建的会话的编辑器标签页,然后执行以下 SQL 语句:

CREATE TEMP TABLE Temperature(degrees INT64)  AS SELECT * FROM UNNEST([30,0,3,14,55]) AS a;

删除或注释掉标签页中的内容,然后执行以下 SQL 语句:

SELECT * FROM Temperature;

确保生成类似结果:

+---------+
| degrees |
+---------+
|      55 |
|      14 |
|       3 |
|       0 |
|      30 |
+---------+

bq

打开 Cloud Shell 并输入以下 bq query 命令:

bq query \
--nouse_legacy_sql \
--session_id=SESSION_ID \
'SQL_STATEMENT'

其中:

  • SESSION_ID:将此值替换为您要使用的会话的 ID
  • SQL_STATEMENT:要在会话中运行的 SQL 语句。

测试您的会话

您创建的会话中创建名为 Temperature 的临时表。将会话 ID 替换为您自己的 ID。

bq query \
  --nouse_legacy_sql \
  --session_id=CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ \
  'CREATE TEMP TABLE Temperature(degrees INT64)  AS SELECT * FROM UNNEST([30,0,3,14,55]) AS a;'

获取 Temperature 表中所有值的列表。将会话 ID 替换为您自己的 ID。

bq query \
  --nouse_legacy_sql \
  --session_id=CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ \
  'SELECT * FROM Temperature;'

确保生成类似结果:

+-------+
| total |
+-------+
|    30 |
|     0 |
|     3 |
|    14 |
|    55 |
+-------+

In session: CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ

将会话添加到 .bigqueryrc 可节省时间

如果您打算使用 Cloud Shell 运行大量查询,可以将会话 ID 添加到 .bigqueryrc 中的 [query],这样就无需将会话 ID 复制粘贴到每个命令中。

.bigqueryrc 中,会话 ID 如下所示:

[query]
--session_id=CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ

将会话 ID 添加到 .bigqueryrc 后,您可改用以下命令:

bq query \
  --nouse_legacy_sql \
  'SELECT * FROM Temperature;'

请注意,如果要使用其他会话或会话终止,则必须更新 .bigqueryrc

API

使用已定义的作业资源调用 jobs.insert 方法或 jobs.query 方法。

jobs.insert

使用以下参数调用 jobs.insert 方法:

{
  "jobReference": {
    "projectId": "PROJECT_ID",
    "jobId": "JOB_ID"
  },
  "configuration": {
    "query": {
      "query": "SQL_STATEMENT",
      "connectionProperties": [{
        "key": "session_id",
        "value": "SESSION_ID"
      }]
    }
  }
}

其中:

  • PROJECT_ID:要为其创建会话的项目。
  • JOB_ID:要为其创建会话的作业。
  • SQL_STATEMENT:会话的第一个 SQL 语句。
  • SESSION_ID会话的 ID

测试您的会话

输入以下请求正文,在您创建的会话中创建名为 Temperature 的临时表。将项目 ID、作业 ID 和会话 ID 替换为您自己的 ID。

{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "job_123"
  },
  "configuration": {
    "query": {
      "query": "CREATE TEMP TABLE Temperature(degrees INT64) AS SELECT * FROM UNNEST([30,0,3,14,55]) AS a;",
      "connectionProperties": [{
        "key": "session_id",
        "value": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
      }]
    }
  }
}

输入以下请求正文,获取会话中 Temperature 表中的所有值的列表。将项目 ID、作业 ID 和会话 ID 替换为您自己的 ID。

{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "job_123"
  },
  "configuration": {
    "query": {
      "query": "SELECT * FROM Temperature;",
      "connectionProperties": [{
        "key": "session_id",
        "value": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
      }]
    }
  }
}

确保两个请求的响应正文如下所示:

{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "job_123"
  },
  "statistics": {
    "sessionInfo": {
      "sessionId": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
    }
  }
}

jobs.query

使用以下参数调用 jobs.query 方法:

{
  "query": "SQL_STATEMENT",
  "connectionProperties": [{
    "key": "session_id",
    "value": "SESSION_ID"
  }]
}

其中:

  • SQL_STATEMENT:会话的第一个 SQL 语句。
  • SESSION_ID会话的 ID

测试您的会话

输入以下请求正文,在您创建的会话中创建名为 Temperature 的临时表。将项目 ID、作业 ID 和会话 ID 替换为您自己的 ID。

{
  "query": "CREATE TEMP TABLE Temperature(degrees INT64) AS SELECT * FROM UNNEST([30,0,3,14,55]) AS a;",
  "connectionProperties": [{
    "key": "session_id",
    "value": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
  }]
}

输入以下请求正文,获取会话中 Temperature 表中的所有值的列表。将项目 ID、作业 ID 和会话 ID 替换为您自己的 ID。

{
  "query": "SELECT * FROM Temperature;",
  "connectionProperties": [{
    "key": "session_id",
    "value": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
  }]
}

确保两个请求的响应正文如下所示:

{
  "jobReference": {
    "projectId": "myProject",
    "jobId": "job_123"
  },
  "statistics": {
    "sessionInfo": {
      "sessionId": "CgwKCmZhbGl1LXRlc3QQARokMDAzYjI0OWQtZ"
    }
  }
}

后续步骤