查询外部表中的 Cloud Storage 数据
本文档介绍了如何查询存储在 Cloud Storage 外部表中的数据。
准备工作
确保您拥有 Cloud Storage 外部表。
所需的角色
如需查询 Cloud Storage 外部表,请确保您具有以下角色:
- BigQuery Data Viewer (roles/bigquery.dataViewer)
- BigQuery User (roles/bigquery.user)
- Storage Object Viewer (roles/storage.objectViewer)
根据您的权限,您可以自行授予这些角色给自己,或者让管理员授予给您。如需详细了解如何授予角色,请参阅查看可针对资源授予的角色。
如需查看查询外部表所需的确切 BigQuery 权限,请展开所需权限部分:
所需权限
- bigquery.jobs.create
- bigquery.readsessions.create(仅当您使用 BigQuery Storage Read API 读取数据时才需要)
- bigquery.tables.get
- bigquery.tables.getData
查询永久外部表
创建 Cloud Storage 外部表后,您可以使用 GoogleSQL 语法查询该表,就如查询标准 BigQuery 表一样。例如 SELECT field1, field2
FROM mydataset.my_cloud_storage_table;。
查询临时外部表
使用临时表查询外部数据源适用于对外部数据进行一次性临时查询,或执行提取、转换和加载 (ETL) 过程。
要在不创建永久表的情况下查询外部数据源,请为临时表提供表定义,然后在命令或调用中使用该表定义来查询临时表。您可以通过以下任一方式提供表定义:
系统会使用表定义文件或提供的架构来创建临时外部表,然后对临时外部表运行查询。
使用临时外部表时,并不会在您的某个 BigQuery 数据集中创建表。由于该表不会永久存储在数据集内,因此无法与他人共享。
您可以使用 bq 命令行工具、API 或客户端库来创建和查询链接到外部数据源的临时表。
bq
您可以使用带有 --external_table_definition 标志的 bq query 命令查询链接到外部数据源的临时表。使用 bq 命令行工具查询链接到外部数据源的临时表时,您可以使用以下项来标识表的架构:
(可选)提供 --location 标志并将其值设置为您的位置。
如需使用表定义文件查询链接到外部数据源的临时表,请输入以下命令。
bq --location=LOCATION query \ --external_table_definition=TABLE::DEFINITION_FILE \ 'QUERY'
替换以下内容:
- LOCATION:您所在位置的名称。- --location是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为- asia-northeast1。您可以使用 .bigqueryrc 文件设置该位置的默认值。
- TABLE:您要创建的临时表的名称。
- DEFINITION_FILE:本地机器上表定义文件的路径。
- QUERY:您要提交到临时表的查询。
例如,以下命令使用名为 sales_def 的表定义文件创建并查询名为 sales 的临时表。
bq query \
--external_table_definition=sales::sales_def \
'SELECT
  Region,
  Total_sales
FROM
  sales'
如需使用内嵌架构定义查询链接到外部数据源的临时表,请输入以下命令。
bq --location=LOCATION query \ --external_table_definition=TABLE::SCHEMA@SOURCE_FORMAT=BUCKET_PATH \ 'QUERY'
替换以下内容:
- LOCATION:您所在位置的名称。- --location是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为- asia-northeast1。您可以使用 .bigqueryrc 文件设置该位置的默认值。
- TABLE:您要创建的临时表的名称。
- SCHEMA:内嵌架构定义,格式为- field:data_type,field:data_type。
- SOURCE_FORMAT:外部数据源的格式。例如- CSV。
- BUCKET_PATH:包含表数据的 Cloud Storage 存储桶的路径,格式为- gs://bucket_name/[folder_name/]file_pattern。- 您可以通过在 - file_pattern中指定一个星号 (- *) 通配符从存储桶中选择多个文件。例如- gs://mybucket/file00*.parquet。如需了解详情,请参阅 Cloud Storage URI 的通配符支持。- 您可以通过提供多个路径来为 - uris选项指定多个存储桶。- 以下示例展示了有效的 - uris值:- gs://bucket/path1/myfile.csv
- gs://bucket/path1/*.parquet
- gs://bucket/path1/file1*、- gs://bucket1/path1/*
 - 如果指定以多个文件为目标的 - uris值,则所有这些文件都必须共享一个兼容的架构。- 如需详细了解如何在 BigQuery 中使用 Cloud Storage URI,请参阅 Cloud Storage 资源路径。 
- QUERY:您要提交到临时表的查询。
例如,以下命令使用以下架构定义创建并查询名为 sales 的临时表,该表链接到存储在 Cloud Storage 中的 CSV 文件:Region:STRING,Quarter:STRING,Total_sales:INTEGER。
bq query \
--external_table_definition=sales::Region:STRING,Quarter:STRING,Total_sales:INTEGER@CSV=gs://mybucket/sales.csv \
'SELECT
  Region,
  Total_sales
FROM
  sales'
如需使用 JSON 架构文件查询链接到外部数据源的临时表,请输入以下命令。
bq --location=LOCATION query \ --external_table_definition=SCHEMA_FILE@SOURCE_FORMAT=BUCKET_PATH \ 'QUERY'
替换以下内容:
- LOCATION:您所在位置的名称。- --location是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为- asia-northeast1。您可以使用 .bigqueryrc 文件设置该位置的默认值。
- SCHEMA_FILE:本地机器上 JSON 架构文件的路径。
- SOURCE_FORMAT:外部数据源的格式。例如- CSV。
- BUCKET_PATH:包含表数据的 Cloud Storage 存储桶的路径,格式为- gs://bucket_name/[folder_name/]file_pattern。- 您可以通过在 - file_pattern中指定一个星号 (- *) 通配符从存储桶中选择多个文件。例如- gs://mybucket/file00*.parquet。如需了解详情,请参阅 Cloud Storage URI 的通配符支持。- 您可以通过提供多个路径来为 - uris选项指定多个存储桶。- 以下示例展示了有效的 - uris值:- gs://bucket/path1/myfile.csv
- gs://bucket/path1/*.parquet
- gs://bucket/path1/file1*、- gs://bucket1/path1/*
 - 如果指定以多个文件为目标的 - uris值,则所有这些文件都必须共享一个兼容的架构。- 如需详细了解如何在 BigQuery 中使用 Cloud Storage URI,请参阅 Cloud Storage 资源路径。 
- QUERY:您要提交到临时表的查询。
例如,以下命令使用 /tmp/sales_schema.json 架构文件创建并查询名为 sales 的临时表,该表链接到存储在 Cloud Storage 中的 CSV 文件。
bq query \ --external_table_definition=sales::/tmp/sales_schema.json@CSV=gs://mybucket/sales.csv \ 'SELECT Region, Total_sales FROM sales'
API
要使用 API 运行查询,请按以下步骤操作:
- 创建一个 Job对象。
- 使用 JobConfiguration对象填充Job对象的configuration部分。
- 使用 JobConfigurationQuery对象填充JobConfiguration对象的query部分。
- 使用 ExternalDataConfiguration对象填充JobConfigurationQuery对象的tableDefinitions部分。
- 调用 jobs.insert方法以异步运行查询,或调用jobs.query方法以同步运行查询,同时传入Job对象。
Java
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Java 设置说明进行操作。 如需了解详情,请参阅 BigQuery Java API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Node.js
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Node.js 设置说明进行操作。 如需了解详情,请参阅 BigQuery Node.js API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
Python
试用此示例之前,请按照 BigQuery 快速入门:使用客户端库中的 Python 设置说明进行操作。 如需了解详情,请参阅 BigQuery Python API 参考文档。
如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证。
查询 _FILE_NAME 伪列
  基于外部数据源的表提供名为 _FILE_NAME 的伪列。此列包含相应行所属文件的完全限定路径。此列仅可用于引用存储在 Cloud Storage、Google 云端硬盘、Amazon S3 和 Azure Blob Storage 中的外部数据的表。
  _FILE_NAME 列名为预留名称,也就是说,您不能在任何表中使用该名称创建列。如需选择 _FILE_NAME 的值,必须使用别名。以下示例查询演示了如何通过将别名 fn 分配给伪列来选择 _FILE_NAME。
  bq query \
  --project_id=PROJECT_ID \
  --use_legacy_sql=false \
  'SELECT
     name,
     _FILE_NAME AS fn
   FROM
     `DATASET.TABLE_NAME`
   WHERE
     name contains "Alex"' 替换以下内容:
- 
    PROJECT_ID是有效的项目 ID(如果使用 Cloud Shell 或在 Google Cloud CLI 中设置默认项目,则不需要此标志)
- 
    DATASET是存储永久外部表的数据集名称
- 
    TABLE_NAME是永久外部表的名称
  如果查询在 _FILE_NAME 伪列上具有过滤条件谓词,则 BigQuery 会尝试跳过读取不满足过滤条件的文件。使用 _FILE_NAME 伪列构造查询谓词时,会应用使用伪列查询注入时间分区表的类似建议。
后续步骤
- 了解如何在 BigQuery 中使用 SQL。
- 了解外部表。
- 了解 BigQuery 配额。