使用 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
(东京)中都有集群的实例中,那么您必须在华沙、比利时或东京中创建外部表。
建议的配置
我们建议您在创建外部表时遵循以下最佳实践:
为避免影响应用处理流量,请在通过 BigQuery 外部表读取 Bigtable 数据时使用 Data Boost 无服务器计算。对于临时查询,使用 Data Boost 尤其经济实惠。如需使用 Data Boost,请在创建外部表定义时指定 Data Boost 应用配置文件。如需详细了解 Data Boost,请参阅 Bigtable Data Boost 概览。
在大多数情况下,创建外部表时,请将
readRowkeyAsString
和ignoreUnspecifiedColumnFamilies
设置为 true。如果
ignoreUnspecifiedColumnFamilies
为 true,当您创建仅包含列族中部分列的表定义时,只有所选列会提升为外部表中的列。未选定列中的数据会归入一个名为column
的常规列中。
如需创建外部表,请按照创建 Bigtable 外部表中的说明操作。
查询外部表中的数据
为 Bigtable 表创建外部表后,您可以使用以下方法之一向该表发送 SQL 查询:
- 在命令行中使用
bq
(BigQuery CLI) - 对 BigQuery API 的调用
- 任何 BigQuery 客户端库
如需了解如何撰写和运行查询,请参阅运行查询。 如需了解特定于 Bigtable 的说明(包括所需权限和代码示例),请参阅查询 Bigtable 数据。
计划查询
如果您想定期将 Bigtable 数据导入 BigQuery,预定查询会非常有用。对于可能需要您构建数据流水线并将数据流式传输到 BigQuery 的用例,它们也很有用。如需了解如何管理安排的查询,请参阅安排查询。
全表扫描
如果您使用 Data Boost 读取数据,则无需避免扫描整个表。不过,如果您使用预配的节点进行计算,则需要这样做。与直接向 Bigtable 表发送读取请求类似,当您查询外部表中的表且未使用 Data Boost 时,通常应避免进行全表扫描。全表扫描会增加 CPU 利用率,并且比选择性查询花费的时间长得多。它们还需要更高的 BigQuery 吞吐量。
如果查询涉及所有行,则会触发全表扫描。另一方面,如果您限制查询并请求一系列行或指定不连续的行,则系统不会扫描整个表。以下是使用 GoogleSQL 语法限制查询的示例:
WHERE rowkey = "abc123"
WHERE rowkey BETWEEN "abc123" PRECEDING AND "abc999" FOLLOWING
WHERE rowkey > 999999
(如果您将行键读取为字符串)
联接
如果您计划使用联接来分析 Bigtable 表数据,并结合其他来源的数据,则应创建一个子查询,用于从 Bigtable 中提取相关字段以进行计划的联接。如需了解有关联接表的更多最佳实践,请参阅优化查询计算。
费用
创建外部表并查询该表时,您需要支付 BigQuery 费用,并且需要支付处理流量所需的 Bigtable 节点数量增加所产生的费用。由于外部表与 Bigtable 表位于同一区域,因此不会产生网络费用。
如果您通常在正常工作时间内运行查询,请考虑启用 Bigtable 自动扩缩功能,以便在需要时增加节点数,并在作业完成后减少节点数。如果您运行的已安排的查询没有明确的截止期限,自动扩缩也是一种有效的策略。
限制费用的另一种方法是避免全表扫描。
如需详细了解如何优化 BigQuery 费用,请参阅估算和控制费用。
限制
存在以下限制:
- 如果查询结果包含具有嵌套类型的序列化数据(例如协议缓冲区 [protobufs] 和 Avro 格式),则在 Google Cloud 控制台中可能会呈现不正确或难以读取。
后续步骤
- 了解外部表和联合查询之间的区别。
- 创建 Bigtable 外部表。
- 查询存储在外部表中的 Bigtable 数据。
- 将数据从 BigQuery 导出到 Bigtable。
- 使用 Bigtable 和 BigQuery 构建实时分析数据库