Игнорировать повторяющиеся записи при добавлении в BigQuery - PullRequest
0 голосов
/ 18 марта 2019

Мы записываем данные из 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 голосов
/ 19 марта 2019

Еще один вариант, который мне нравится в BigQuery, - это вставка с использованием слияния DML. Это довольно удачное решение, если этот набор подходит для вас. Вы можете видеть больше деталей в этой ссылке .

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
0 голосов
/ 19 марта 2019

Я подозреваю, что невозможно, чтобы ваш код вставил дубликат поля (Id и field1 совпадали) с индикатором 'U', как вы упомянули в коде. Ваш код должен вернуть ошибку, если есть дублирующее поле, потому что будетникакие данные в поле «Индикатор» и количество столбцов не будут совпадать, поместите поле else в регистр и используйте другой запрос на выборку для фильтрации полей с индикатором «U» или «I». Если поле «Индикатор» не требуется, используйте команду слияния ...

"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
"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...