【问题标题】:Eliminating duplicate records in a BigQuery Table消除 BigQuery 表中的重复记录
【发布时间】:2012-09-03 00:52:57
【问题描述】:

我计划每天将增量数据附加到 BigQuery 表中。每次向现有表添加增量数据时,我都想从表中的现有数据中消除重复记录(基于主键列)。 一种方法是 -

  1. 从增量数据中收集一组键(我们称之为INCR_KEYS
  2. 在 -SELECT all_cols from table where pkey_col NOT IN (INCR_KEYS) 的行上运行查询 - 并将结果存储在新表中。
  3. 将增量数据附加到新表中。

我对这种方法的担忧是它会创建一个大表的副本并添加到我的账单中。

有没有更好的方法在不创建重复表的情况下实现相同的目标?

【问题讨论】:

  • 桌子有多大?如果压缩后大于 64MB,#2 将失败。
  • @RyanBoyd - 这应该不是问题。如果 INCR_KEYS>64MB,我可以将 INCR_KEYS 分成更小的块并重复
  • 问题是整个表(即不在INCR_KEYS中的数据)是否> 64MB。 #2 中的 SELECT 查询不会成功。
  • @RyanBoyd - 嗯,再次查看开发人员指南。那就得想​​个办法了。感谢您指出这一点!
  • 重新回答您的 R 问题。我同意我们需要更好的渠道让您提出这类问题。我们正在尝试找出最适合您的方法,同时确保所有技术/开发人员问题都出现在 SO 中。与此同时,请随时通过 Google+ 上的profiles.google.com/ryan.boyd 和 twitter 上的 ryguyrg 与我们联系。

标签: google-bigquery


【解决方案1】:

我不知道在不创建重复表的情况下如何做到这一点——这实际上听起来是一个非常聪明的解决方案。

但是,您的增量成本可能非常小 - BigQuery 只会针对数据存在的时间长度向您收费。如果您删除旧表,您只需为这两个表支付几秒钟或几分钟的费用。

【讨论】:

  • 谢谢@Jordan,我可以忍受!如果有人可以在不涉及重复表的情况下提出解决方案,那仍然会很棒。
【解决方案2】:

您可以在目标表设置为现有表的情况下运行查询,并将写入处置设置为截断:

bq query --allow_large_results --replace --destination_table=mydataset.mytable \
    'SELECT * FROM mydataset.mytable
     WHERE key NOT IN (SELECT key FROM mydataset.update)'
bq cp --append_table mydataset.update mydataset.mytable

我相信这会奏效,但我认为值得进行备份,尤其是因为您可以稍后将其删除。

bq cp mydataset.mytable mydataset.backup
# You can also build the new table in one pass:
bq query --allow_large_results --replace --destination_table=mydataset.mytable \
    'SELECT * FROM (
         SELECT * FROM mydataset.mytable
         WHERE key NOT IN (SELECT key FROM mydataset.update)
     ), (
         SELECT * FROM mydataset.update
     )'
bq rm mydataset.backup

【讨论】:

  • 这到底是如何工作的,你是如何填写 mydataset.update 的?
【解决方案3】:

您可以设置一个新的目标表,然后按所有列查询计数和分组:

SELECT
  FIELD1,
  FIELD2,
  FIELD3,
  FIELD4
FROM (
  SELECT
    COUNT (*),
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4
  FROM
    [<TABLE>]
  GROUP BY
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    • 2021-06-19
    相关资源
    最近更新 更多