使用 BigQuery 查询和分析 Bigtable 数据

BigQuery 是一个托管式数据仓库,可帮助您使用 SQL 查询查询和分析 Bigtable 数据。BigQuery 非常适合数据分析师、数据工程师、数据科学家或任何想要使用 Bigtable 数据回答业务问题的用户。

借助 BigQuery,您可以从 BigQuery 查询 Bigtable 数据。当您想要将 Bigtable 数据联接到 BigQuery 表时,此功能会很有帮助。

本文档简要介绍了如何使用 BigQuery 查询 Bigtable 数据。在阅读本页内容之前,您应先熟悉 Bigtable 概览BigQuery 概览

对于每行都具有相同列族和列限定符的表,使用 BigQuery 查询 Bigtable 表非常适合。

创建外部表

您或贵组织中的管理员必须先创建外部表,然后才能查询 Bigtable 数据。外部表是一种 BigQuery 表,其中包含指向您要将查询发送到的 Bigtable 表的元数据指针。如需详细了解外部表,请参阅外部数据源简介

您必须在 Bigtable 表所在的区域中创建外部表。例如,这意味着,如果表位于一个实例中,而该实例的集群分别位于 europe-central2-a(华沙)、europe-west1-c(比利时)和 asia-east1-a(东京),那么您必须在华沙、比利时或东京创建外部表。

在大多数情况下,创建外部表时,请将 readRowkeyAsStringignoreUnspecifiedColumnFamilies 设置为 true

如果 ignoreUnspecifiedColumnFamilies 为 true,当您创建仅包含列族中部分列的表定义时,只有所选列会被提升为外部表中的列。未选列中的数据会归入一个通用的 column 列下。

如需创建外部表,请按照创建 Bigtable 外部表中的说明操作。

查询外部表中的数据

为 Bigtable 表创建外部表后,您可以使用以下方法之一向其发送 SQL 查询:

如需了解如何编写和运行查询,请参阅运行查询。如需了解 Bigtable 专用说明(包括所需权限和代码示例),请参阅查询 Bigtable 数据

计划查询

如果您想定期将 Bigtable 数据导入 BigQuery,则可以使用定期查询。它们还适用于可能需要您构建数据流水线并将数据流式传输到 BigQuery 的用例。如需了解如何管理安排的查询,请参阅安排查询

避免全表扫描

与直接向 Bigtable 表发送读取请求时类似,当您针对表查询外部表时,通常应避免全表扫描。全表扫描会增加 CPU 使用率,并且所花时间比选择性查询要长得多。它们还需要更多 BigQuery 吞吐量。

如果您的查询涉及所有行,则会触发全表扫描。另一方面,如果您限制查询并请求行范围或指定的非连续行,则系统不会扫描整个表。以下是使用 GoogleSQL 语法限制查询的示例:

  • WHERE rowkey = "abc123"
  • WHERE rowkey BETWEEN "abc123" PRECEDING AND "abc999" FOLLOWING
  • WHERE rowkey > 999999(如果您将行键读取为字符串)

联接

如果您打算使用联接来结合分析 Bigtable 表数据和其他来源的数据,则应创建一个子查询,以便从 Bigtable 中提取相关字段以进行计划的联接。如需了解有关联接表的更多最佳实践,请参阅优化查询计算

费用

创建外部表并对其进行查询时,您需要为 BigQuery 费用以及处理流量所需增加的 Bigtable 节点数量付费。由于您的外部表与 Bigtable 表位于同一区域,因此不会产生网络费用。

如果您通常在正常工作时间运行查询,不妨考虑启用 Bigtable 自动扩缩功能,以便在需要时增加节点数,并在作业完成后减少节点数。如果您运行的定期查询没有确定的截止期限,自动扩缩也是一项有效的策略。

另一种限制费用的方法是避免全表扫描

如需详细了解如何优化 BigQuery 费用,请参阅估算和控制费用

限制

存在以下限制:

  • 您无法使用 BigQuery 查询以 JSON 格式存储的 Bigtable 数据。
  • 如果查询结果包含具有嵌套类型(例如协议缓冲区 [protobuf] 和 Avro 格式)的序列化数据,则这些结果在 Google Cloud 控制台中可能会呈现错误或难以读取。

后续步骤