Google BigQuery没有主键或唯一约束,如何防止重复记录被插入?

时间:2017-03-21 21:42:50

标签: google-bigquery

Google BigQuery没有主键或唯一约束。

我们无法使用insert ignoreinsert on duplicate key update等传统SQL选项,那么如何防止将重复记录插入到Google BigQuery中?

如果我必须首先调用delete(基于我自己系统中的唯一键)然后插入以防止重复记录被插入bigquery,那么效率是否太低?我认为插入是最便宜的操作,没有查询,只是附加数据。对于每个插入,如果我必须调用删除,它将是太低效并且花费我们额外的钱。

根据您的经验,您有什么建议和建议?

bigquery有主键会很好,但是它可能与bigquery基于的算法/数据结构冲突?

3 个答案:

答案 0 :(得分:8)

首先让我们明确一些事实。

Bigquery是一个适用于大型数据集的托管数据仓库,并且它是免费的,不能替代传统数据库

每天最多只能对一张桌子进行96次DML(更新,删除)操作。这是设计的。它很低,因为它迫使你像BQ一样思考数据湖。

所以在Bigquery上你实际上让每个数据都进入,一切都只是通过设计追加。这意味着通过设计,您拥有一个数据库,可以为每次更新保留一个新行。因此,如果您想使用最新数据,则需要选择最后一行并使用它。

我们实际上利用了我们添加到同一行的每个新更新的洞察力。例如,我们可以检测最终用户在注册流程中选择国家的时间。因为我们有一个国家的下拉,它滚动到他的国家花了一些时间,并且指标显示了这一点,因为我们最终在BQ中有两行,一个选择了一个国家,一个选择了国家,并且基于时间选择我们是能够优化过程。现在,在我们国家/地区的下拉列表中,我们列出了最近/最常见的5个国家/地区,因此这些用户不再需要滚动和选择国家/地区,而且速度更快。

答案 1 :(得分:2)

“批量删除和插入”是我用来避免重复记录的方法。谷歌自己的“Youtube BigQuery Transfer Services”也在使用“批量删除和插入”。

“Youtube BigQuery Transfer Services”每天将每日报告推送到同一组报告表。每条记录都有一个“日期”列。

当我们运行Youtube Bigquery Transfer回填时(请求youtube bigquery转移再次推送某些日期的报告。)Youtube BigQury转移服务将首先删除报告表中该日期的完整数据集,然后插入完整的数据集那个日期再次回到报告表。

另一种方法是首先删除结果表(如果已存在),然后重新创建结果表并再次将结果重新输入表中。我经常使用这种方法。每天,我将过程数据结果保存在日常数据集的某些结果表中。如果我重新运行当天的进程,我的脚本将检查当天的结果表是否存在。如果当天存在表,请将其删除,然后重新创建一个新的新表,然后将处理结果重新输入到新创建的表中。

答案 2 :(得分:0)