导出表数据
本页面介绍如何将 BigQuery 表中的数据导出或提取到 Cloud Storage。
将数据加载到 BigQuery 中之后,您可以使用多种格式导出数据。BigQuery 最多可以将 1 GB 的数据导出到单个文件中。如果要导出 1 GB 以上的数据,您必须将数据导出到多个文件。将数据导出到多个文件时,文件的大小会有所不同。
您可以使用 Dataflow 等服务从 BigQuery 读取数据,而不必手动导出数据。如需详细了解如何使用 Dataflow 对 BigQuery 执行读写操作,请参阅 Apache Beam 文档中的 BigQuery I/O。
您还可以使用 EXPORT DATA
语句导出查询结果。
导出限制
从 BigQuery 导出数据时,请注意以下事项:
- 您不能将表数据导出到本地文件、表格或云端硬盘。系统唯一支持的导出位置是 Cloud Storage。如需了解如何保存查询结果,请参阅下载和保存查询结果。
- 您最多可以将 1 GB 的表数据导出到单个文件中。如果要导出 1 GB 以上的数据,请使用通配符将数据导出到多个文件。将数据导出到多个文件时,各个文件的大小会有所不同。
- 您不能使用 CSV 格式导出嵌套数据和重复数据。Avro、JSON 和 Parquet 导出格式支持嵌套和重复数据。
- 使用 JSON 格式导出数据时,INT64(整数)数据类型会编码为 JSON 字符串,以便在其他系统读取数据时保留 64 位精度。
- 您无法在一个导出作业中导出多个表中的数据。
- 使用 Cloud Console 导出数据时,您不能选择
GZIP
以外的压缩类型。 - 将数据导出到配置了保留政策的 Cloud Storage 存储分区时,BigQuery 可能无法将文件写入存储分区。请考虑在导出作业期间放宽保留政策。
- 以 JSON 格式导出表时,系统会使用 Unicode 表示法
\uNNNN
转换符号<
、>
和&
,其中N
是十六进制数字。例如,profit&loss
变为profit\u0026loss
。完成此 Unicode 转换是为了避免安全漏洞。 - 除非您使用
EXPORT DATA
语句并在query_statement
中指定ORDER BY
子句,否则无法保证导出表数据的顺序。
准备工作
授予为用户提供执行本文档中的每个任务所需权限的 Identity and Access Management (IAM) 角色。
所需权限
如需执行本文档中的任务,您需要以下权限。
从 BigQuery 表导出数据的权限
如需从 BigQuery 表导出数据,您需要 bigquery.tables.export
IAM 权限。
以下每个预定义 IAM 角色都具有 bigquery.tables.export
权限:
roles/bigquery.dataViewer
roles/bigquery.dataOwner
roles/bigquery.dataEditor
roles/bigquery.admin
运行导出作业的权限
如需运行导出作业,您需要拥有 bigquery.jobs.create
IAM 权限。
以下每个预定义的 IAM 角色均包含运行导出作业所需的权限:
roles/bigquery.user
roles/bigquery.jobUser
roles/bigquery.admin
将数据写入 Cloud Storage 存储桶的权限
如需将数据写入现有 Cloud Storage 存储桶,您需要拥有以下 IAM 权限:
storage.objects.create
storage.objects.delete
以下每个预定义的 IAM 角色均包含将数据写入现有 Cloud Storage 存储桶所需的权限:
roles/storage.objectAdmin
roles/storage.admin
如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限。
位置注意事项
在选择数据的位置时,请考虑以下事项:
- 共置 Cloud Storage 存储分区,以导出数据。
- 如果您的 BigQuery 数据集位于多区域,则包含您要导出的数据的 Cloud Storage 存储桶必须位于同一多区域或该多区域内的位置。例如,如果您的 BigQuery 数据集位于“EU”多区域,则 Cloud Storage 存储桶可以位于欧盟内的“europe-west1”比利时区域。
- 如果您的数据集位于某个区域,则 Cloud Storage 存储桶必须位于同一区域。例如,如果您的数据集位于“asia-northeast1”东京区域,则 Cloud Storage 存储桶不能位于“ASIA”多区域。
- 例外情况:如果您的数据集位于“US”多区域,则您可以将数据导出到任何位置的 Cloud Storage 存储桶。
- 制定数据管理计划。
- 如果您选择区域存储资源(如 BigQuery 数据集或 Cloud Storage 存储分区),请制定按地理位置管理数据的计划。
如需详细了解 Cloud Storage 位置,请参阅 Cloud Storage 文档中的存储分区位置。
在不同位置之间移动 BigQuery 数据
您无法在创建数据集后更改其位置,但可以创建数据集的副本。您无法将数据集从一个位置移动到另一个位置,但可以手动移动(重新创建)数据集。
导出格式和压缩类型
对于导出数据,BigQuery 支持以下数据格式和压缩类型。
数据格式 | 支持的压缩类型 | 详情 |
---|---|---|
CSV | GZIP | 您可以使用 不支持嵌套数据和重复数据。 |
JSON | GZIP | 支持嵌套和重复数据。 |
Avro | DEFLATE、SNAPPY | Avro 导出格式不支持 GZIP 压缩类型。 支持嵌套和重复数据。请参阅 Avro 导出详细信息。 |
Parquet | SNAPPY、GZIP | 支持嵌套和重复数据。请参阅 Parquet 导出详细信息。 |
导出存储在 BigQuery 中的数据
您可以通过以下方式导出表数据:
- 使用 Cloud Console
- 在
bq
命令行工具中使用bq extract
命令。 - 通过 API 或客户端库提交
extract
作业
导出表数据
如需从 BigQuery 表导出数据,请执行以下操作:
控制台
在 Cloud Console 中打开 BigQuery 页面。
在探索器面板中,展开您的项目和数据集,然后选择表。
在详情面板中,点击导出,然后选择导出到 Cloud Storage。
在将表导出到 Google Cloud Storage 对话框中,执行以下操作:
- 对于选择 Google Cloud Storage 的位置,请浏览要导出数据的存储分区、文件夹或文件。
- 在导出格式中,选择导出数据的格式:CSV、JSON(以换行符分隔)、Avro 或 Parquet。
- 在压缩部分,选择压缩格式或选择
None
表示不压缩。 - 点击导出以导出表。
要检查作业进度,请在导航窗格顶部附近查找导出作业的作业记录。
SQL
使用 EXPORT DATA
语句。以下示例从名为 mydataset.table1
的表中导出选定的字段。
在 Cloud 控制台中,前往 BigQuery 页面。
在查询编辑器中,输入以下语句:
EXPORT DATA OPTIONS ( uri = 'gs://bucket/folder/*.csv', format = 'CSV', overwrite = true, header = true, field_delimiter = ';') AS ( SELECT field1, field2 FROM mydataset.table1 ORDER BY field1 );
点击
运行。
如需详细了解如何运行查询,请参阅运行交互式查询。
bq
结合使用 bq extract
和 --destination_format
标志。
(可选)提供 --location
标志并将其值设置为您的位置。
其他可选标志包括:
--compression
:此标志表示导出文件使用的压缩类型。--field_delimiter
:此标志是在使用 CSV 导出格式的输出文件中用于表示各列之间边界的字符。\t
和tab
都可用来表示制表符分隔符。--print_header
:如果指定了此标志,则系统在输出带有标题的格式(如 CSV)时,就会输出标题行。
bq extract --location=location \ --destination_format format \ --compression compression_type \ --field_delimiter delimiter \ --print_header=boolean \ project_id:dataset.table \ gs://bucket/filename.ext
其中:
- location 是位置的名称。
--location
是可选标志。例如,如果您在东京区域使用 BigQuery,可将该标志的值设置为asia-northeast1
。您可以使用 .bigqueryrc 文件设置位置的默认值。 - format 是导出数据的格式:
CSV
、NEWLINE_DELIMITED_JSON
、AVRO
或PARQUET
。 - compression_type 是数据格式支持的压缩类型。请参阅导出格式和压缩类型。
- delimiter 是用于表示 CSV 导出文件中各列之间边界的字符。您可以使用
\t
和tab
表示制表符。 - boolean 是
true
或false
。设置为true
时,如果数据格式支持标题,则标题行将输出到导出数据。默认值为true
。 - project_id 是项目 ID。
- dataset 是源数据集的名称。
- table 是您要导出的表。
- bucket 是要向其中导出数据的 Cloud Storage 存储分区的名称。BigQuery 数据集和 Cloud Storage 存储分区必须位于同一位置。
- filename.ext 是导出数据文件的名称和扩展名。您可以使用通配符导出到多个文件。
示例:
例如,以下命令会将 mydataset.mytable
导出到名为 myfile.csv
的 gzip 压缩文件中。myfile.csv
存储在名为 example-bucket
的 Cloud Storage 存储分区中。
bq extract \ --compression GZIP \ 'mydataset.mytable' \ gs://example-bucket/myfile.csv
默认目标格式是 CSV。要导出为 JSON 或 Avro 格式,请使用 destination_format
标志并将其设置为 NEWLINE_DELIMITED_JSON
或 AVRO
。例如:
bq extract \ --destination_format NEWLINE_DELIMITED_JSON \ 'mydataset.mytable' \ gs://example-bucket/myfile.json
以下命令会将 mydataset.mytable
导出到使用 Snappy 压缩的 Avro 文件中。该文件的名称为 myfile.avro
。myfile.avro
将导出到名为 example-bucket
的 Cloud Storage 存储分区。
bq extract \ --destination_format AVRO \ --compression SNAPPY \ 'mydataset.mytable' \ gs://example-bucket/myfile.avro
API
如需导出数据,请创建一个 extract
作业,并填充作业配置。
(可选)在作业资源的 jobReference
部分的 location
属性中指定您的位置。
创建一个 extract 作业,将其指向 BigQuery 源数据和 Cloud Storage 目标。
使用包含项目 ID、数据集 ID 和表 ID 的
sourceTable
配置对象,来指定源表。destination URI(s)
属性必须是完全限定的,格式为gs://bucket/filename.ext
。 每个 URI 都可以包含一个“*”通配符,此通配符必须位于存储分区名称之后。通过设置
configuration.extract.destinationFormat
属性来指定数据格式。例如,要导出 JSON 文件,可将此属性设置为NEWLINE_DELIMITED_JSON
值。如需检查作业状态,请使用初始请求返回的作业 ID 来调用 jobs.get(job_id)。
- 如果
status.state = DONE
,则表示作业已成功完成。 - 如果出现
status.errorResult
属性,则表示请求失败,并且该对象将包含描述问题的相关信息。 - 如果未出现
status.errorResult
,则表示作业已成功完成,但可能存在一些非严重错误。返回的作业对象的status.errors
属性中列出了非严重错误。
- 如果
API 说明:
在调用
jobs.insert
来创建作业时,最佳做法是生成唯一 ID,并将其作为jobReference.jobId
传递。此方法比较不会受到网络故障的影响,因为客户端可以对已知的作业 ID 进行轮询或重试。对指定的作业 ID 调用
jobs.insert
具有幂等性,即您可以对同一作业 ID 进行无限次重试,但最多只会有一个成功操作。
C#
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 C# 设置说明进行操作。如需了解详情,请参阅 BigQuery C# API 参考文档。
Go
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
Java
试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
Node.js
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
PHP
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 PHP 设置说明进行操作。如需了解详情,请参阅 BigQuery PHP API 参考文档。
Python
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
Ruby
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Ruby 设置说明进行操作。如需了解详情,请参阅 BigQuery Ruby API 参考文档。
Avro 导出详情
BigQuery 通过以下方式表示 Avro 格式的数据:
- 所生成的导出文件是 Avro 容器文件。
- 每个 BigQuery 行均表示为一条 Avro 记录。嵌套数据由嵌套的 record 对象表示。
REQUIRED
字段表示为相应的 Avro 类型。例如,BigQueryINTEGER
类型会映射到 AvroLONG
类型。NULLABLE
字段表示为相应类型的 Avro 并集和一个“null”。REPEATED
字段表示为 Avro 数组。TIMESTAMP
数据类型在提取作业和导出数据 SQL 中默认表示为timestamp-micros
逻辑类型(用于注解 AvroLONG
类型)。(注意:您可以将use_avro_logical_types=False
添加到Export Data Options
来停用逻辑类型,以便在时间戳列中改用string
类型,但在提取作业中,它始终使用 Avro 逻辑类型。)- 在 Export Data SQL 中,
DATE
数据类型默认表示为date
逻辑类型(它注释 AvroINT
类型),但默认情况下在提取作业中表示为string
类型。(注意:您可以将use_avro_logical_types=False
添加到Export Data Options
以停用逻辑类型,或使用--use_avro_logical_types=True
标志在提取作业中启用逻辑类型。) - 在 Export Data SQL 中,
TIME
数据类型默认表示为timestamp-micro
逻辑类型(它注释 AvroLONG
类型),但默认情况下在提取作业中表示为string
类型。(注意:您可以将use_avro_logical_types=False
添加到Export Data Options
以停用逻辑类型,或使用--use_avro_logical_types=True
标志在提取作业中启用逻辑类型。) - 在 Export Data SQL 中,
DATETIME
数据类型默认表示为 AvroSTRING
类型(具有自定义指定逻辑类型datetime
的字符串类型),但在提取作业中表示为string
类型。(注意:您可以将use_avro_logical_types=False
添加到Export Data Options
以停用逻辑类型,或使用--use_avro_logical_types=True
标志在提取作业中启用逻辑类型。)
注意:字符串类型的编码遵循互联网工程任务组 RFC 3339 规范。
* 参数化NUMERIC(P[, S])
和 BIGNUMERIC(P[, S])
数据类型会将其精度和缩放类型参数转换为 Avro 十进制逻辑类型。Avro 格式不能与 GZIP 压缩类型结合使用。要压缩 Avro 数据,请使用 bq
命令行工具或 API,并指定 Avro 数据支持的一种压缩类型(DEFLATE
或 SNAPPY
)。
Parquet 导出详细信息
BigQuery 会将标准 SQL 数据类型转换为以下 Parquet 数据类型:
BigQuery 数据类型 | Parquet 原初类型 | Parquet 逻辑类型 |
---|---|---|
整数 | INT64 |
NONE |
数字 | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = 38, scale = 9) |
Numeric(P[, S]) | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = P, scale = S) |
BigNumeric | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = 76, scale = 38) |
BigNumeric(P[, S]) | FIXED_LEN_BYTE_ARRAY |
DECIMAL (precision = P, scale = S) |
浮点 | FLOAT |
NONE |
布尔值 | BOOLEAN |
NONE |
字符串 | BYTE_ARRAY |
STRING (UTF8) |
字节 | BYTE_ARRAY |
NONE |
日期 | INT32 |
DATE |
日期时间 | INT64 |
TIMESTAMP (isAdjustedToUTC = false, unit = MICROS) |
时间 | INT64 |
TIME (isAdjustedToUTC = true, unit = MICROS) |
时间戳 | INT64 |
TIMESTAMP (isAdjustedToUTC = false, unit = MICROS) |
Parquet 架构将嵌套数据表示为一组,将重复记录表示为重复组。如需详细了解如何在 BigQuery 中使用嵌套和重复数据,请参阅指定嵌套和重复列。
您可以对 DATETIME
类型使用以下解决方法:
- 将文件加载到暂存表中。然后,使用 SQL 查询将字段转换为
DATETIME
,并将结果保存到新表中。如需了解详情,请参阅更改列的数据类型。 - 在加载作业中使用
--schema
标志为表提供架构。将日期时间列定义为col:DATETIME
。
将数据导出到一个或多个文件
destinationUris
属性指示 BigQuery 应将您的文件导出到的一个或多个位置和文件名。
BigQuery 支持在每个 URI 中使用单个通配符运算符 (*)。通配符可以出现在 URI 中的任何位置,但不能包含在存储分区的名称中。使用通配符运算符可指示 BigQuery 根据所提供的模式创建多个分片文件。通配符运算符会替换为数字(从 0 开始),并向左填充 12 位。例如,如果 URI 的文件名末尾处带有通配符,那么在创建文件时,第一个文件的名称末尾会附加 000000000000
,第二个文件的名称末尾会附加 000000000001
,依次类推。
下表描述了 destinationUris
属性的几种可能的选项:
destinationUris 选项 |
|
---|---|
单个 URI |
如果要导出的表数据未超过 1 GB,请使用单个 URI。最常见的使用情形就是采用这种方式,因为导出的数据通常都小于 1 GB 上限值。 属性定义:
创建: gs://my-bucket/file-name.json |
单个通配符 URI |
如果您认为导出的数据会超过 1 GB 上限值,那么可以使用单个通配符 URI。BigQuery 会根据所提供的模式将数据分片到多个文件。各个导出文件的大小会有所不同。 如果在文件名以外的 URI 组成部分中使用通配符,请在导出数据之前确保不存在路径组成部分。 属性定义:
创建: gs://my-bucket/file-name-000000000000.json gs://my-bucket/file-name-000000000001.json gs://my-bucket/file-name-000000000002.json ... |
提取压缩表
Go
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Go 设置说明进行操作。如需了解详情,请参阅 BigQuery Go API 参考文档。
Java
试用此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Java 设置说明进行操作。如需了解详情,请参阅 BigQuery Java API 参考文档。
Node.js
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Node.js 设置说明进行操作。如需了解详情,请参阅 BigQuery Node.js API 参考文档。
Python
尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档。
配额政策
如需了解导出作业配额,请参阅“配额和限制”页面中的导出作业。
价格
目前,从 BigQuery 导出数据是免费的,但有相关的 BigQuery 配额和限制。 如需详细了解 BigQuery 价格,请参阅价格页面。
导出数据后,如果您将数据存储在 Cloud Storage 中,则需要为此付费。如需详细了解 Cloud Storage 价格,请参阅 Cloud Storage 价格页面。
表安全性
如需控制对 BigQuery 中表的访问权限,请参阅表访问权限控制简介。
后续步骤
- 如需详细了解 Cloud Console,请参阅使用 Cloud Console。
- 如需详细了解
bq
命令行工具,请参阅使用bq
命令行工具。 - 如需了解如何使用 BigQuery API 客户端库创建应用,请参阅客户端库快速入门。