无论如何将存储桶中的数据合并到表中但没有任何重复的行?

Posted

技术标签:

【中文标题】无论如何将存储桶中的数据合并到表中但没有任何重复的行?【英文标题】:Is there anyway to merge data from a bucket into a table but without any duplicate rows? 【发布时间】:2017-11-09 02:28:53 【问题描述】:

我在 Google 存储桶中有数百个 CSV 文件。我每天添加更多数据,然后使用bq 命令重新加载表:

$ bq  load  --replace  --project_id=my_proj-123  my_dataset_id.fav_table gs://my_bucket/table_data/*  <my schema>

很遗憾,我的一些数据有重复项。有没有办法加载表格但没有重复的行?

【问题讨论】:

你能用数据流吗? 您是否每次都重新加载所有文件? 是的,存储桶中的文件保持不变,我每天都会添加一个新文件。添加新文件后,我核对现有表并从存储桶中的所有文件重新制作它。 【参考方案1】:

您无法使用 bq 命令阻止在 BigQuery 表中插入重复项。不过你可以manually remove the duplicates after insertion:

#standardSQL
SELECT
  MAX(count) FROM(
  SELECT
    [ID_COLUMN],
    count(*) as count
  FROM
    `[TABLE_NAME]`
  GROUP BY
    [ID_COLUMN])

此查询返回最大数量的重复条目,基于 id 列。当然,您必须有一个唯一标识符来定义数据集中的重复项(在这种情况下,重复项是具有相同 id 列值的行)。

如果查询返回>1,则表示存在重复。然后,通过运行以下查询:

#standardSQL
SELECT
  * EXCEPT(row_number)
FROM (
  SELECT
    *,
    ROW_NUMBER()
          OVER (PARTITION BY [ID_COLUMN]) row_number
  FROM
    `[TABLE_NAME]`)
WHERE
  row_number = 1

您将收到一份无重复版本的表格。同样,通过 id 列和帮助器列row_number,可以识别和不计重复项。请注意,建议将结果写入新表(不会更改原始表,只是选择非重复数据)。

另外,这个问题在这里有部分答案: https://***.com/a/43587206/3615567.

【讨论】:

以上是关于无论如何将存储桶中的数据合并到表中但没有任何重复的行?的主要内容,如果未能解决你的问题,请参考以下文章

将SP的输出游标合并到表中?

如何检查未插入表中的重复值?

将 GCS 存储桶中的 .csv 文件中的数据加载到 Cloud SQL 表中:

Redshift中的存储过程将数据加载到表中

从命名阶段将数据合并到表中

将数据从文件同步到数据库