在BigQuery中追加时忽略重复的记录

时间:2019-03-18 13:51:59

标签: mysql google-bigquery

我们正在将数据从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中读取数据时,我们都会将其存储在临时表中。

谢谢

2 个答案:

答案 0 :(得分:0)

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

"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
"

答案 1 :(得分:0)

我喜欢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