我需要对我正在处理的一个用例提出一些建议。
用例:
我们在 Cloud SQL 中有大约 5-10 个表的数据,其中一些被视为查找,另一些被视为事务。我们需要将其提供给 BigQuery,以便从中制作 3-4 个表(扁平化、嵌套表或非规范化表(,这些表将用于在 Data Studio、Looker 等中进行报告。
数据应该以增量方式处理,Cloud SQL 中的更改可能每 5 分钟发生一次,这意味着数据应该近乎实时地提供给 BigQuery 报告。如果可能,我们还应该维护数据更改的历史记录。
溶液:
我们在 BigQuery 中保留了 3 层,因此来自 Cloud SQL 的数据来到第一层,然后在扁平化后将其保存到第二层(维护历史记录(,然后对其进行处理以插入第三层(报告(。这种方法的问题在于它是为日常处理而开发的,不能帮助处理Cloud SQL中每5分钟的数据变化。
欢迎任何建议。
注意:-我们需要使用数据流,VM或其他方式来进行一些逻辑处理,这意味着我们不能只使用计划查询,因为我们不能使用查询来处理所有逻辑,但是是的,可以使用视图和代码的组合。
这比你想象的要简单得多:BigQuery可以直接从你的Cloud SQL中读取数据。
文档:
- https://cloud.google.com/bigquery/docs/cloud-sql-federated-queries
更多阅读:
- https://medium.com/google-cloud/loading-mysql-backup-files-into-bigquery-straight-from-cloud-sql-d40a98281229
因此,您需要做的就是编写一个MySQL查询,以查找过去5分钟的所有更改。您可以从 BigQuery 中运行此查询 - 并使用一个查询将所有数据具体化到 BigQuery 中,如下所示:
INSERT INTO `dataset.table`
SELECT *
FROM EXTERNAL_QUERY(
'your.CloudSql.database'
, 'SELECT * FROM users')
这是一个有趣的用例!如果 BQ 外部查询不是您的干扰,我们最近构建了一个解决方案,将 MySQL 中的表与 BigQuery 中的表"同步"。
该解决方案通过使用两个组件来工作:
- 与Debezium一起开发的连接器,用于发布从MySQL到PubSub的更改
- 一个数据流管道,用于从 PubSub 使用这些更改,并将其推送到 BigQuery
请参阅此自述文件以了解如何部署它:https://github.com/GoogleCloudPlatform/DataflowTemplates/tree/master/v2/cdc-parent/
让我知道它是否有帮助!