数据加载简介

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

概览

您可以通过多种方式将数据提取到 BigQuery 中:

  • 批量加载一组数据记录。
  • 流式传输个别记录或批量记录。
  • 使用查询生成新数据,并将结果附加到表中或覆盖表中的数据。
  • 使用第三方应用或服务。

本部分简要介绍了每种方法。

批量加载。使用批量加载时,可通过单个批量操作将源数据加载到 BigQuery 表中。例如,数据源可以是 CSV 文件、外部数据库或一组日志文件。传统的提取、转换和加载 (ETL) 作业属于此类别。

在 BigQuery 中进行批量加载的选项包括:

  • 通过创建加载作业,从 Cloud Storage 或本地文件加载数据。记录可以是 Avro、CSV、JSON、ORC 或 Parquet 格式。
  • 使用 BigQuery Data Transfer Service 自动从 Google 软件即服务 (SaaS) 应用或第三方应用和服务加载数据。
  • 使用其他代管式服务从外部数据存储区中导出数据并将数据导入到 BigQuery 中。例如,您可以从 Firestore 导出文件加载数据。

批量加载可以作为一次性操作执行,也可以按周期性计划执行。例如,您可以执行以下操作:

  • 您可以按计划运行 BigQuery Data Transfer Service 传输作业。
  • 您可以使用 Cloud Composer 等编排服务来安排加载作业。
  • 您可以使用 Cron 作业来按计划加载数据。

流式传输。 使用流式传输,可以一次性或批量发送数据。您可以编写直接调用流式传输 API 的代码,也可以将 Dataflow 与 Apache Beam SDK 搭配使用来设置流式传输流水线。

生成的数据。您可以使用数据操纵语言 (DML) 语句执行批量插入现有表中或将查询结果存储在新表中。

第三方应用一些第三方应用和服务提供可将数据提取到 BigQuery 中的连接器。如何配置和管理提取流水线的详细信息取决于应用。

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

BigQuery 还可以对某些类型的外部数据运行查询,而无需将数据加载到 BigQuery 存储空间中。如需了解详情,请参阅加载数据的替代方案

亲自尝试

如果您是 Google Cloud 新手,请创建一个帐号来评估 BigQuery 在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。

免费试用 BigQuery

选择数据提取方法

选择数据提取方法时,需要考虑以下注意事项。

数据源。数据来源或数据格式可决定批量加载或流式传输是否更易于实现和维护。请考虑以下几点:

  • 如果 BigQuery Data Transfer Service 支持数据源,则将数据直接传输到 BigQuery 可能是最容易实现的解决方案。

  • 如果您的数据来自 Spark 或 Hadoop,请考虑使用 BigQuery 连接器来简化数据提取。

  • 对于本地文件,请考虑批量加载,特别是当 BigQuery 支持这种文件格式时,无需执行转换或数据清理步骤。

  • 对于应用事件或日志流等应用数据,实时流式传输数据可能更容易,而不是实现批量加载。

缓慢更改的数据与快速更改的数据。如果您需要近乎实时地提取和分析数据,请考虑流式传输数据。借助流式传输,每条记录一旦到达即可查询数据。应避免使用 DML 语句来提交大量单独的行更新或插入。对于频繁更新的数据,通常最好是流式传输更改日志并使用视图来获取最新结果。另一个选项是使用 Cloud SQL 作为 Online Transaction Processing (OLTP) 数据库,并使用联合查询来联接 BigQuery 中的数据。

如果源数据更改缓慢或您不需要持续更新的结果,请考虑使用加载作业。例如,如果您使用数据运行每日或每小时报告,则加载作业的费用可能较低,并且使用的系统资源数量较少。

另一种情况是到达频率较低或为响应事件而产生的数据。在这种情况下,请考虑使用 Dataflow 流式传输数据,或使用 Cloud Functions 调用流式传输 API 来响应触发器。

解决方案的可靠性。BigQuery 具有服务等级协议 (SLA)。但是,您还需要考虑所实现的特定解决方案的可靠性。请考虑以下几点:

  • 对于 JSON 或 CSV 等弱类型格式,错误数据可能会使整个加载作业失败。考虑是否需要在加载之前执行数据清理步骤,并考虑如何响应错误。另外,请考虑使用强类型格式,例如 Avro、ORC 或 Parquet。
  • 定期加载作业需要使用 Cloud Composer、cron 或其他工具进行安排。安排组件可能会成为解决方案中的故障点。
  • 借助流式传输,您可以检查每条记录是否成功,并快速报告错误。考虑将失败的消息写入未处理的消息队列,以供日后分析和处理。如需详细了解 BigQuery 流式传输错误,请参阅排查流式传输问题
  • 流式传输和加载作业受配额限制。如需了解如何处理配额错误,请参阅排查 BigQuery 配额错误
  • 第三方解决方案在配置、可靠性、排序保证及其他因素方面可能存在差异,因此在采用某个解决方案之前,请考虑这些因素。

延迟时间。考虑加载的数据量以及您需要数据可用的快慢。流式传输提供了让数据可用于分析的最低延迟。定期加载作业的延迟时间较长,因为须在每个加载作业都完成后,新数据才可用。

默认情况下,加载作业使用的共享池。加载作业可能会以待处理状态等待到槽可用,尤其是在您加载非常大量的数据时。如果这样会导致不可接受的等待时间,您可以购买专用槽,而不是使用共享的槽池。如需了解详情,请参阅预留简介

外部数据源的查询性能可能低于存储在 BigQuery 中的数据的查询性能。如果最大限度地减少查询延迟时间很重要,则建议将数据加载到 BigQuery 中。

数据提取格式。根据以下因素选择数据提取格式:

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

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

  • 嵌入式换行符。从 JSON 文件加载数据时,各行内容必须以换行符分隔。BigQuery 要求以换行符分隔的 JSON 文件必须每行包含一条记录。

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

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

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

反规范化是用于提高之前已规范化的关系型数据集的读取性能的常用策略。在 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 提供了多项第三方转移作业服务

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

Google Analytics 360

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

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

Dataflow

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

加载数据的替代方案

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

公共数据集
公共数据集是存储在 BigQuery 中并公开共享的数据集。如需了解详情,请参阅 BigQuery 公共数据集
共享数据集
您可与他人共享存储在 BigQuery 中的数据集。如果有人与您共享了某个数据集,您可以在不加载数据的情况下对该数据集运行查询。
外部数据源
您可以通过查询外部数据源中的数据来跳过数据加载过程。通过此方法,您可以充分利用 BigQuery 的分析功能,而无需移动存储在其他位置的数据。如需了解这种方法的优点和限制,请参阅外部数据源
日志文件
Cloud Logging 提供了将日志文件导出到 BigQuery 的选项。如需了解详情,请参阅使用日志查看器导出日志

后续步骤