如何过滤 bigquery 的重复表行数据以删除重复行?

Posted

技术标签:

【中文标题】如何过滤 bigquery 的重复表行数据以删除重复行?【英文标题】:How can I filter duplicate TableRow data for big query to remove duplicate rows? 【发布时间】:2019-11-20 05:31:00 【问题描述】:

我是 Dataflow 的新手,如果我的问题很有趣,请原谅我,我正在阅读一个 csv 文件并且它有重复的行,我正在读取这些数据并写入大查询,但是我不想重复数据到我的 BQ 表。

我想到了一种方法,但我不知道如何实现它,它涉及向架构添加某种标志以标记它唯一但我不知道如何

Lists.newArrayList(
  new TableFieldSchema()
         .setName("person_id")
         .setMode("NULLABLE").setType("STRING"),
  new TableFieldSchema()
         .setName("person_name")
         .setMode("NULLABLE")
         .setType("STRING") // Cant I add another unique property here?
) 

不知道该方法是否可行,但我只需要过滤从转换中检索到的行,例如

PCollection<TableRow> peopleRows = 
  pipeline
     .apply(
        "Convert to BiqQuery Table Row",
        ParDo.of(new FormatForBigquery())

    // Next step to filter duplicates

【问题讨论】:

【参考方案1】:

如果我们将用于读取 CSV 的输出视为 PCollection,那么我们可以通过 Distinct 转换传递 PCollection 来消除重复项。此转换的目的是获取输入 PCollection 并生成一个新的 PCollection,它是没有重复的原始 PCollection。作为 Distinct 预制转换的一部分,有机会指定一个自己的函数,该函数将被调用以确定将两个 PCollection 对象分类为相等的类别以及删除哪些对象。

【讨论】:

【参考方案2】:

您可以直接在 bigquery 中执行此操作,加载整个文件并使用目标表作为源表运行如下查询。无需数据流。

WITH cte as (
  SELECT
    ROW_NUMBER() over (PARTITION BY column1,column2,column3,...) as idx,
    *
  FROM my_table
)
SELECT
*
FROM cte
WHERE idx = 1

【讨论】:

以上是关于如何过滤 bigquery 的重复表行数据以删除重复行?的主要内容,如果未能解决你的问题,请参考以下文章

bigQuery 和 GA-Premium 集成:从 GA 中的未过滤视图导出数据时,如何在 bigQuery 中使用 IP 过滤器(以排除内部流量)

如何在视图或计划查询之间进行选择,以对通过 Stitch 导入的 BigQuery 表进行重复数据删除?

如何排除按钮被过滤?

如何禁止向BigQuery加载重复的行?

如何动态添加表行[重复]

大批量数据插入MySQL ,如何过滤掉重复数据?