Во время действия DML обнаружена повторяющаяся строка - Снежинка - Таленд

Я хочу загрузить данные в Snowflake с помощью Talend. Я использовал tSnowflakeOutput с опцией Upsert, потому что я хочу вставить данные, если они не существуют в Snowflake, или обновить строки, если они существуют. Я использовал первичный ключ для идентификации уже существующих строк.

Когда я запускаю свою работу, у меня появляется следующая ошибка:

Во время действия DML обнаружена повторяющаяся строка

Я знаю, что проблема связана с строкой, которая существует в Snowflake, я хочу обновить строку, но все, что у меня есть, - это эта ошибка. у тебя есть идея почему?

Пожалуйста помоги :)


person MBD MBD    schedule 10.01.2020    source источник
comment
Не могли бы вы поделиться подробным описанием ошибки или скриншотом здесь? В Snowflake есть функция, позволяющая не загружать повторяющиеся даты в течение определенного времени, но не знаю, как это работает с Talend.   -  person Data Engineering Simplified    schedule 10.01.2020
comment
Возможно ли, что у вас нет уникальной записи о ключе, который вы используете для MERGE в источнике? Snowflake не любит, когда вы пытаетесь MERGE в таблицу, где в источнике есть повторяющиеся записи. Убедитесь, что и ваш источник, и цель уникальны для вашего ключа.   -  person Mike Walton    schedule 10.01.2020


Ответы (1)


Соединитель Talend может быть внутренне с помощью операции MERGE Snowflake. Как упоминал @ mike-walton, об ошибке сообщается, потому что MERGE не принимает дубликаты в исходных данных. Учитывая, что это операция вставки или обновления, если существует операция, если несколько исходных строк присоединяются к целевой записи, система не может решить, какую исходную строку использовать для операции.

Из документации

Когда слияние объединяет строку в целевой таблице с несколькими строками в источнике, следующие условия объединения дают недетерминированные результаты (т. Е. Система не может определить исходное значение для использования для обновления или удаления целевой строки) Выбрана целевая строка для обновления с несколькими значениями (например, КОГДА СООТВЕТСТВУЕТ ... ТОГДА ОБНОВЛЕНИЕ)

Решения 1

Один из вариантов, упомянутый в документации можно установить параметр ERROR_ON_NONDETERMINISTIC_MERGE. Это просто выберет произвольную исходную строку для обновления.

Решения 2

Другой вариант - сделать его детерминированным, используя запрос MERGE следующей формы. По сути, это выполняет дедупликацию в исходной таблице и позволяет вам выбрать один из дубликатов в качестве предпочтительного для обновления.

merge into taget_table t
using (
  select *
  from source_table
  qualify
    row_number() over (
      partition by 
        the_join_key
      order by
        some_ordering_column asc
    ) = 1
) s
on s.the_join_key = t.the_join_key
when matched then update set
  ...
when not matched then insert 
  ...
;

Выполнение того же самого в Talend может просто потребовать выполнения операции дедупликации в восходящем направлении в сопоставлении ETL.

person Dhwani Katagade    schedule 23.10.2020