如何最好地缓存 bigquery table 以快速查找单个行?

How best cache bigquery table for fast lookup of individual row?

我在 bigquery 中有一个原始数据 table,它有数亿行。我 运行 每 24 小时执行一次计划查询以生成一些聚合结果 table 在 3300 万行 (6gb) 的标记中,但可能会缓慢增长到大约其当前大小的两倍。

我需要一种方法在单独的事件驱动管道中通过 id 快速访问查找聚合 table 一次获取一行。即一个进程被通知 A 刚刚采取了行动,我们从聚合中知道这个人的历史是什么 table?

显然 bigquery 是生成聚合的正确工具 table,但不是快速查找的正确工具。所以我需要将它偏移到像 firestore 这样的辅助数据存储。但这样做的最佳流程是什么?

我可以设想几个策略:

1) 安排将 agg table 转储到 GCS。启动数据流作业以将 gcs 转储的内容流式传输到 pubsub。创建一个无服务器函数来监听 pubsub 主题并将行插入 firestore。

2) 计算引擎上的一个长 运行ning 脚本,它直接从 BQ 流式传输 table 和 运行s 插入。 (似乎比策略 1 慢)

3) 安排将 agg table 转储到 GCS。以可以通过 gcloud beta firestore import gs://[BUCKET_NAME]/[EXPORT_PREFIX]/

直接导入到 firestore 的方式进行格式化

4) 也许是某种直接针对 bigquery 执行查找的数据流作业 table?以前没有玩过这种方法。不知道成本/性能如何。

5) 我没有考虑过的其他选项?

理想的解决方案是允许我在几毫秒内快速访问一个聚合行,这将允许我将数据附加到实时事件。

在我应该遵循的策略中是否有明显的最佳赢家?

请记住,您还可以按 ID 对 table 进行 CLUSTER - 使您的查找查询更快,消耗的数据更少。不过,他们仍然需要一秒以上才能 运行。

您还可以设置从 BigQuery 到 CloudSQL 的导出,以获得亚秒级结果:

请记住,现在 BigQuery 可以直接从 CloudSQL 中读取,如果您希望它成为 "hot-data" 的真实来源: