Это была проблема, с которой я столкнулся при развертывании определенного Capp в одной из наших настроек DAS. Пытаясь решить вышеупомянутую проблему, я смог найти немного внутренних деталей о том, как первичные ключи работают на wso2das-3.1.0, и хотя было бы полезно опубликовать его на случай, если кто-то столкнется с подобной ситуацией.

Запуск искровых скриптов - это способ выполнения аналитики пакетной обработки при работе с WSO2 DAS 3.1.0 [1]. В приведенном выше подходе могут быть случаи, когда вы определили свои таблицы без надлежащего первичного ключа / ключей или пропустили одно или два (более) поля, которые должны находиться в пределах ограничения первичного ключа. В соответствии с тем, как работает первичный ключ в WSO2 DAS 3.1.0, добавление первичных ключей (как полностью новых, так и оставшихся полей) на более позднем этапе к существующей таблице может привести к дублированию записей, как описано ниже.

При переопределении таблиц с соответствующими первичными ключами в любом из вышеупомянутых сценариев (добавление полностью нового первичного ключа или добавление новых полей для существующего ограничения первичного ключа) введенное ограничение первичного ключа не проверяет уже доступные записи в существующей таблице, когда вставка новых записей. Это приводит к вставке повторяющихся записей (дубликатов записей, которые существовали до определения ограничений первичного ключа), даже если соответствующие первичные ключи определены.

Проще говоря, допустим, что Таблица A имеет поля «NIC» и «Name», а первичные ключи не определены. Предположим, что следующие записи также существуют в приведенной выше таблице, и вы использовали следующий запрос для вставки данных в таблицу TableA

CREATE TEMPORARY TABLE TableA USING CarbonAnalytics OPTIONS (tableName “TableA”, schema “NIC string -i, Name string -i”, mergeSchema “false”);
INSERT INTO TABLE TableA 
SELECT NIC, Name
FROM sampleStream;

Согласно требованию, запрос на вставку переопределяется следующим образом с добавлением соответствующего первичного ключа (NIC).

CREATE TEMPORARY TABLE TableA USING CarbonAnalytics OPTIONS (tableName "TableA", schema "NIC string -i, Name string -i", primaryKeys "NIC", mergeSchema "false");
INSERT INTO TABLE TableA 
SELECT NIC, Name
FROM sampleStream;

После выполнения вышеизложенного уже существующие записи (98579324V и 98721232V) снова вставляются в таблицу без учета определенного ограничения первичного ключа, и новое определенное ограничение вступает в силу только при последних вставках той же записи.

Согласно wso2 analyticsteam поведение wso2das-3.1.0 на первичных ключах выглядит следующим образом:

Поведение DAS относительно первичного ключа таково: он содержит первичный ключ временной таблицы в качестве метаданных внутри DAS и определяет первичный ключ для данных при их вставке в базу данных. Эти первичные ключи не определены в физической базе данных. Из-за такого поведения DAS, если мы изменим схему (добавив первичный ключ) в середине, он не будет учитывать уже вставленные данные для первичного ключа и вставлять эти данные снова.

Поэтому, чтобы избежать добавления дубликатов, необходимо сначала INSERT OVERWRITE соответствующие таблицы (в данном случае TableA) с определением соответствующих первичных ключей (новые / измененные ограничения первичного ключа) следующим образом:

CREATE TEMPORARY TABLE TableA USING CarbonAnalytics OPTIONS (tableName "TableA", schema "NIC string -i, Name string -i", primaryKeys "NIC", mergeSchema "false");
INSERT OVERWRITE TABLE TableA 
SELECT NIC, Name
FROM sampleStream;

После выполнения вышеуказанного ТаблицаA будет заново заполнена недублирующими данными, а затем запрос INSERT OVERWRITE insert будет заменен на INSERT INTO с теми же первичными ключами, которые определены, чтобы получить значительный прирост производительности по сравнению с использованием INSERT INTO с соответствующими первичными ключами. Определенные ключи более эффективны и быстрее, чем использование INSERT OVERWRITE, которое удаляет всю таблицу и повторно заполняет ее заданными данными, что влияет на общую производительность wso2das-3.1.0.

Надеюсь это поможет :)