Это была проблема, с которой я столкнулся при развертывании определенного 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 analytics
team поведение 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
.
Надеюсь это поможет :)