gpt4 book ai didi

google-bigquery - 通过在没有导入/导出的情况下加入 Google BigQuery 上的 2 个表来删除/更新表条目

转载 作者:行者123 更新时间:2023-12-01 16:29:35 26 4
gpt4 key购买 nike

我们有一个用例,我们在一个表中有数亿个条目,并且在进一步拆分它时遇到问题。 99% 的操作都是附加的。但是,我们偶尔会进行更新和删除,Google 自己说这只有通过删除一个表并使用最新数据创建一个新表才能实现。

因为它有很多数据,我们希望在 30 秒左右的时间内更新表格,所以我们考虑了将 Original tableRefresher Table 连接起来的可能性> 在某种程度上,我们只有出现在原始表中但不出现在刷新表中的条目(删除的情况),或者如果找到则用刷新表中的数据写入项目(更新的情况)。输出/目标应该是新表,然后我们将使用 WRITE_TRUNCATE(覆盖)将其复制回原始表。如果更新看起来太复杂,我们可以使用仅删除逻辑并自己重新插入更新的项目。

这可能吗?哪种类型的联接似乎最合适?我们会将我们的更新流式插入刷新表并定期清理原始表。我们不必为重新插入整个原始表(无论是时间还是金钱)而付费,而只需为查询一次和向更新表插入少量流媒体内容付费。

编辑:在定期合并发生之前,我们可以忍受查询陈旧数据。我们还可以在维护期间暂停查询一小段时间。

欢迎任何想法。

最佳答案

所以要在我的评论中添加更多内容:

Why don't you just accept the updates as a new row in your table, and have queries that read only the last row from the table? That's much easier.

像这样创建一个 View :

select * from (
SELECT
rank() over (partition by user_id order by timestamp desc) as _rank,
*
FROM [db.userupdate_last]
) where _rank=1

并更新您的查询以查询 View 表和您的基本表,您就完成了。

一些上下文我们如何使用它。我们有一个保存用户个人资料数据的事件表。在每次更新时,我们都会在 BQ 中再次附加完整的配置文件数据行。这意味着我们最终得到一个版本化的内容,该 user_id 的行数与他们完成的更新次数一样多。这都在同一张表中,通过查看时间我们知道更新的顺序。让我们说我们的表:[userupdate]。如果我们做一个

select * from userupdate where user_id=10

它将以随机顺序返回该用户对其个人资料所做的所有更新。

但是我们创建了一个 View ,我们只创建了一次,语法如上。现在当我们:

select * from userupdate_last where user_id=10 #notice the table name changed to view name

它只会返回 1 行,即用户的最后一行。如果我们想从一个包含一堆仅附加行的表中查询,我们有查询,我们只是将表名交换为 View 名称。

关于google-bigquery - 通过在没有导入/导出的情况下加入 Google BigQuery 上的 2 个表来删除/更新表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34838622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com