数据加载简介

本页面简要介绍了如何将数据加载到 BigQuery 中。

概览

许多情况下,您无需加载数据即可执行查询。 但在其他所有情况下,您必须先将数据加载到 BigQuery 中,然后才能运行查询。

您可以通过以下方式将数据加载到 BigQuery 中:

  • Cloud Storage本地文件加载一组数据记录。记录可以是 Avro、CSV、JSON(仅限换行符分隔格式)、ORC 或 Parquet 格式。
  • DatastoreFirestore 导出数据,并将导出的数据加载到 BigQuery 中。
  • 其他 Google 服务(例如 Google Ad Manager 和 Google Ads)加载数据。
  • 使用流式插入功能,一次流式传输一条数据记录。
  • 将数据从 Dataflow 流水线写入 BigQuery。
  • 使用 DML 语句执行批量插入操作请注意,BigQuery 会对 DML 查询收费。请参阅数据操纵语言价格

目前不支持将 Google 云端硬盘中的数据加载到 BigQuery,但您可以使用外部表查询 Google 云端硬盘中的数据。

您可以将数据加载到新的表或分区、将数据附加到现有的表或分区,或者覆盖表或分区。如需详细了解如何使用分区,请参阅管理分区表。当数据加载到 BigQuery 时,它会转换为适用于 Capacitor 的列式格式(BigQuery 的存储格式)。

限制

将数据加载到 BigQuery 时需要遵循一些限制,具体取决于源数据的位置和格式:

选择数据提取格式

加载数据时,请根据以下几个因素选择数据提取格式:

  • 架构支持

    Avro、ORC、Parquet、Datastore 导出文件和 Firestore 导出文件是自描述格式。BigQuery 会根据源数据自动创建表架构。对于 JSON 和 CSV 数据,您可以提供明确的架构,也可以使用架构自动检测

  • 平展型数据或嵌套和重复的字段。

    Avro、CSV、JSON、ORC 和 Parquet 都支持平面数据。Avro、JSON、ORC、Parquet、Datastore 导出文件和 Firestore 导出文件还支持包含嵌套重复字段的数据。表示分层数据时,这种嵌套重复数据会很实用。此外,在对数据进行反规范化处理时,嵌套重复字段可以减少重复情况。

  • 嵌入式换行符

    从 JSON 文件加载数据时,各行内容必须以换行符分隔。在 BigQuery 中,以换行符分隔的 JSON 文件必须每行包含一条记录。

  • 编码。

    BigQuery 支持采用 UTF-8 编码的嵌套数据或重复数据以及平展型数据。此外,它还支持采用 ISO-8859-1 编码的平展型数据,但这仅适用于 CSV 文件。

  • 外部限制

    您的数据可能来自以 JSON 格式原生存储数据的文档存储数据库,也可能来自仅以 CSV 格式导出数据的来源。

加载压缩和未压缩的数据

加载压缩数据和未压缩数据时,首选格式都是 Avro 二进制格式。Avro 数据加载速度更快,因为可以并行读取数据,即使数据块已经过压缩也是如此。系统不支持压缩的 Avro 文件,但支持压缩的数据块。BigQuery 支持将 DEFLATE 和 Snappy 编解码器用于 Avro 文件中的压缩数据块。

Parquet 二进制格式也是一个不错的选择,因为 Parquet 可高效地逐列进行编码,这通常会改善压缩比并减小文件大小。Parquet 文件还可利用支持并行加载文件的压缩方法。 系统不支持经过压缩的 Parquet 文件,但支持经过压缩的数据块。对于 Parquet 文件中的压缩数据块,BigQuery 支持使用 Snappy、GZip 和 LZO_1X 编解码器。

ORC 二进制文件格式的优势与 Parquet 格式相类似。ORC 文件中的数据加载速度很快,因为可以并行读取数据条带。每个数据条带中的行将按顺序加载。为了优化加载时间,建议使用大小约为 256 MB 或更小的数据条带。系统不支持经过压缩的 ORC 文件,但支持经过压缩的文件页脚和条带。 对于 ORC 文件页脚和条带,BigQuery 支持使用 Zlib、Snappy、LZO 和 LZ4 压缩。

对于其他数据格式(如 CSV 和 JSON),BigQuery 加载未经压缩文件的速度要比加载经过压缩的文件快得多,因为系统可以并行读取未经压缩的文件。由于未经压缩的文件较大,因此使用这些文件可能会超出带宽限制,并且数据在加载到 BigQuery 之前会产生较高的 Cloud Storage 暂存费用。请注意,无论文件是否已经过压缩,都无法保证行的排序。您需要根据具体用例来权衡这些利弊,这一点很重要。

一般来说,如果带宽有限,建议先使用 gzip 将 CSV 和 JSON 文件压缩,然后再上传到 Cloud Storage。目前,当您将数据加载到 BigQuery 中时,gzip 是 CSV 和 JSON 文件唯一支持的文件压缩类型。如果加载速度对您的应用很重要,并且您有足够的带宽来加载数据,请将文件保留为未压缩状态。

加载反规范化的嵌套重复数据

许多开发者都习惯于使用关系型数据库和规范化的数据架构。 规范化处理可避免存储重复的数据,还可确保数据定期更新的一致性。

在数据经过反规范化处理后,BigQuery 的执行效果最佳。要提高性能,您可以对数据进行反规范化并利用嵌套重复的字段,而无需保留星型或雪花型等关系架构。嵌套重复的字段不但可以保持数据之间的关系,而且也不会因保留关系(规范化)架构对性能产生影响。

使用规范化数据节省的存储空间对于现代系统来说已不再那么重要。使用反规范化的数据虽然会增加存储费用,但可以提高性能,因此是值得的。联接需要协调数据(通信带宽)。反规范化会将数据本地化到各个,因此可以实现并行执行。

要在对数据进行反规范化的同时保持关系,您可以使用嵌套重复字段,而不是完全展平数据。如果将关系型数据完全展平,网络通信(数据重排)会对查询性能产生负面影响。

例如,如果对订单架构进行反规范化而不使用嵌套重复的字段,您可能需要按 order_id 这样的字段进行数据分组(如果存在一对多关系)。由于涉及数据重排,与使用嵌套重复的字段对数据进行反规范化相比,对数据进行分组的做法效率较为低下。

在某些情况下,对数据进行反规范化并使用嵌套重复字段并不会提高性能。请避免在以下使用场景中执行反规范化:

  • 您采用的是星型架构且维度更改频繁。
  • BigQuery 执行行级层的变更来补全 Online Transaction Processing (OLTP) 系统,但无法取代该系统。

嵌套重复的字段支持以下数据格式:

  • Avro
  • JSON(以换行符分隔)
  • ORC
  • Parquet
  • Datastore 导出文件
  • Firestore 导出文件

如需了解如何在加载数据时指定架构中的嵌套重复字段,请参阅指定嵌套重复的字段

从其他 Google 服务加载数据

BigQuery Data Transfer Service

BigQuery Data Transfer Service 会自动将以下服务中的数据加载到 BigQuery:

Google 软件即服务 (SaaS) 应用 外部云存储服务商 数据仓库 此外,Google Cloud Marketplace 提供了多项第三方转移作业服务(Beta 版)。

配置完数据转移功能后,BigQuery Data Transfer Service 会自动安排和管理从源应用到 BigQuery 的定期数据加载作业。

Google Analytics 360

如需了解如何将会话和命中数据从 Google Analytics 360 报告数据视图导出到 BigQuery,请参阅 Google Analytics(分析)帮助中心内的 BigQuery Export

如需查看在 BigQuery 中查询 Google Analytics(分析)数据的示例,请参阅 Google Analytics(分析)帮助中的 BigQuery 实战宝典

数据流

Dataflow 可以将数据直接加载到 BigQuery 中。如需详细了解如何使用 Dataflow 对 BigQuery 执行读写操作,请参阅 Apache Beam 文档中的 BigQuery I/O 连接器

加载数据的替代方案

在以下情况下,您无需在运行查询之前加载数据:

公共数据集
公共数据集是存储在 BigQuery 中并公开共享的数据集。如需了解详情,请参阅 BigQuery 公共数据集
共享数据集
您可与他人共享存储在 BigQuery 中的数据集。如果有人与您共享了某个数据集,您可以在不加载数据的情况下对该数据集运行查询。
外部数据源
您可以跳过数据加载过程,方法是创建以外部数据源为基础的表。如需了解这种方法的优点和限制,请参阅外部数据源
日志文件
Cloud Logging 提供了将日志文件导出到 BigQuery 的选项。如需了解详情,请参阅使用日志查看器导出日志

另一种数据加载方法是以一次一条记录的方式流式插入数据。 如果您希望数据立即可供使用,通常就需要使用流式插入数据的方式。 如需了解流式插入,请参阅将数据流式插入 BigQuery

配额政策

如需了解与加载数据相关的配额政策,请参阅“配额和限制”页面中的加载作业

价格

目前,将数据加载到 BigQuery 的操作不会产生任何费用。 如需了解详情,请参阅价格页面。

后续步骤