Как передать данные UPSERT в реляционную базу данных с помощью Apache Spark: Часть 2

На мой взгляд, Database UPSERT не будет полным без разговоров о функциональности MERGE. В этом блоге мы рассмотрим, как можно выполнить UPSERT с помощью команды MERGE.

SELECT из таблицы базы данных, а затем INSERT или UPDATE в зависимости от условия - традиционный способ обработки данных UPSERT. С помощью оператора MERGE вы можете объединить эти операторы в один и улучшить общую производительность отдельной транзакции.

Большинство реляционных баз данных поддерживают команду MERGE. В примере части 1 я использовал MySQL. Но MERGE не поддерживается MySQL, однако есть другой способ добиться того же в MySQL:

ВСТАВИТЬ… ПРИ ДВОЙНОМ ОБНОВЛЕНИИ КЛЮЧА

Если вы указываете опцию ON DUPLICATE KEY UPDATE в операторе INSERT, и новая строка вызывает повторяющееся значение в индексе UNIQUE или PRIMARY KEY, MySQL выполняет обновление старой строки на основе новых значений.

В этом примере я собираюсь использовать базу данных DB2 и оператор MERGE. Ниже приведена синтаксическая диаграмма для оператора MERGE, показывающая все его основные предложения:

В простейшей форме оператор MERGE выглядит так:

MERGE INTO <table-name>
USING <table-reference>
AS <correlation-name>
ON <search-condition>
WHEN NOT MATCHED THEN <insertSQL> THEN 
WHEN MATCHED THEN <updateSQL>

Давайте перепишем шаг 4 в примере части 1, используя команду MERGE.

4. Обновите записи таблицы базы данных с помощью Spark.

В нашем примере допустим, школьный город «Гарден Сити» изменен на «Нью-Йорк», а «Университет в Олбани, Государственный университет Нью-Йорка» - на изменено на Государственный университет Олбани.

Давайте посмотрим, как это будет обновлено в школьной таблице.

Шаг 4.1: Получите данные из файла CSV для обновления школьной таблицы

Шаг 4.2: Настройте параметры соединения JDBC. Обратите внимание, что я изменил параметр подключения для набора базы данных DB2.

Шаг 4.3: Передайте параметры соединения JDBC узлам кластера.

Шаг 4.4: Просмотрите все данные, разделенные на разделы, установите соединение JDBC для каждого раздела и выполните оператор MERGE.

В приведенном выше примере используется Coalesce. Вы также можете использовать повторное разбиение.

Кстати, вот разница между объединением и повторным разделением.

Шаг 4.5: Выполните оператор MERGE, используя значения столбцов, добавьте все записи фрейма данных в пакет и выполните пакет.

Я протестировал как оператор MERGE (без оптимизации среды и запроса), так и операторы SELECT / INSERT / UPDATE в кластере разработки, и оператору MERGE потребовалось 3 минуты 40 секунд для загрузки 100000 записей, тогда как SELECT / UPDATE / INSERT заняло 8 минут 6 секунд. Во всех моих выполнениях оператор MERGE выполнялся намного лучше, чем традиционные SELECT / и UPDATE / INSERT.