【问题标题】:Ignore duplicate records while appending in BigQuery在 BigQuery 中追加时忽略重复记录
【发布时间】:2019-08-08 21:57:38
【问题描述】:

我们正在将数据从 MySql 写入 BigQuery。我们设置了一些指标,例如

  • 插入 - 如果是第一次添加记录,则在“指示符”字段中使用“I”保存
  • 更新 - 如果记录有一些更新的数据,则在“指示符”字段中使用“U”保存它,如果没有更改,则忽略重复记录。

但在“更新”的情况下,它也会写入重复的记录,甚至没有改变。以下是我们当前用于将数据插入 BigQuery 表的查询。我们可以对此查询进行哪些更改?

"insert into `actual_table` 

(
    Id,
   ...
)
select
temp.Id,
...
case when actual.Id is null then 'I'
when actual.Id is not null and actual.field1<>temp.field1 then 'U'
end as Indicator,
FROM `temp_table` temp 
left outer join `actual_table` actual
on temp.Id= actual.Id"

实际表是 BigQuery 中的表,而临时表是 BigQuery 中的临时表。每次我们从 MySql 读取数据时,我们都会将其存储在临时表中。

谢谢

【问题讨论】:

  • 您好 Aneela,您能否提供您正在运行的示例数据集。我喜欢 BigQuery 的另一个选项是使用合并 DML 命令进行插入,如下所示:cloud.google.com/bigquery/docs/reference/standard-sql/…。如果它适合您的用例,这是一个非常好的解决方案。
  • 谢谢塔米尔。这听起来是一个很好的解决方案。
  • 很高兴你发现它有用,我将它作为答案发布,如果你能接受并投票,那就太好了,祝你好运。

标签: mysql google-bigquery


【解决方案1】:

我喜欢 BigQuery 的另一个选项是使用合并 DML 进行插入,如果它适合您的用例,这是一个非常好的解决方案。您可以在此link 中查看更多详细信息。

Sql 示例:

MERGE
    `mytable` as tgt
USING
    `mytable` as src
ON FALSE
WHEN NOT MATCHED AND src._PARTITIONTIME = '2019-02-21'
THEN INSERT (_PARTITIONTIME, fields...) VALUES (_PARTITIONTIME, fields...)
WHEN NOT MATCHED BY SOURCE AND tgt._PARTITIONTIME = '2019-02-21'
THEN DELETE

【讨论】:

【解决方案2】:

我怀疑您的代码不可能像您在代码中提到的那样使用“U”指示符插入重复字段(Id 和 field1 相同),如果存在重复字段,您的代码必须返回错误,因为会有“Indicator”字段和列数中没有数据将不匹配,将 else 字段放入 case 并使用另一个 select 查询过滤具有“U”或“I”指标的字段 如果不需要Indicator字段,请使用合并命令...

"insert into `actual_table` 

(
    Id,
   ...
)
select * from
(
select
temp.Id,
...
case when actual.Id is null then 'I'
when actual.Id is not null and actual.field1<>temp.field1 then 'U'
else null 
end as Indicator,
FROM `temp_table` temp 
left outer join `actual_table` actual
on temp.Id= actual.Id
)
where Indicator is not null
"

【讨论】:

    猜你喜欢
    • 2018-04-26
    • 1970-01-01
    • 1970-01-01
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多