【发布时间】:2019-06-24 13:40:07
【问题描述】:
我正在尝试对 Bigquery 中名为 order、order_item 和 user 的三个表进行非规范化和连接。我已经有一个管道,用于使用 pubsub 和数据流更新这些表。现在我想创建一个管道,只要在提到的三个表中的任何一个发生更新或插入时,它就会更新一个新的非规范化表。 order 和 order_item 的这些更新必须同步,并且只有在 order 发生插入时才应加入用户(以便在创建新订单时显示用户状态)。
到目前为止,我想出了两个解决方案。
- 一种方法是在通过数据流读取来自 pubsub 的消息时捕获每个表上的更改,然后使用非规范化表中的最新相应记录进行丰富。最后,旧记录被新记录替换。
- 另一个是查询 order 和 order_item 表以获取更新或新插入的行,然后使用 bigquery sql 将它们连接起来,从而将结果附加到非规范化表中。此作业在 Airflow 的帮助下定期运行。
订购
id(主键) 上次更新时间 created_at user_id(外键)
======================
order_item
id(主键) 上次更新时间 created_at order_id(外键)
======================
用户
id(主键) 上次更新时间 created_at
我对数据流不是很熟悉,也找不到任何说明如何使用它完成工作的教程或示例(尽管有示例代码显示如何完成 ETL 操作,但没有解决方案同步问题)。有没有我可以研究的例子,哪种方法看起来更有效?
【问题讨论】:
-
对您的问题有一些疑问: 1. 您是否有三个 pubsub 主题(用户、订单、订单项)? 2. 你想让 order 和 order_item 同步更新。这是什么意思? 3.order和order_item表有新更新后,你想order_item加入order_id,然后加入user表,对吧?
-
1.对于所有三个表,我只有一个 pubsub 主题。 2.我的意思是例如在决赛桌中,不应该有过期的订单记录与其他表格连接导致表格错误。新添加的行必须始终包含除 user 之外的每个表的最新值。 3. 是的。
标签: google-bigquery etl google-cloud-dataflow apache-beam