9

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

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

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

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

4

3 回答 3

5

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

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

于 2012-09-10T15:13:08.173 回答
1

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

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
于 2014-04-04T05:41:06.043 回答
0

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

SELECT
  FIELD1,
  FIELD2,
  FIELD3,
  FIELD4
FROM (
  SELECT
    COUNT (*),
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4
  FROM
    [<TABLE>]
  GROUP BY
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4)
于 2015-12-02T18:09:00.013 回答