Сохранение существующего элемента в таблице из DataFrame - PullRequest
0 голосов
/ 04 августа 2020

У меня есть фреймы данных, в которых есть несколько строк, некоторые из которых уже существуют в db. Я хочу обновить несколько столбцов существующих строк. Как мы можем это сделать?

Я вижу, что у нас есть SaveModes: append и override, которые могут служить этой цели, но в обоих случаях есть ограничение.

  1. С append я получение ошибки первичного ключа, так как этот параметр пытается создать новую строку в db
  2. С ovverride я потеряю значения для неизмененных атрибутов в кортеже.

Кто-нибудь может предложить как я могу обновить несколько атрибутов (значения столбцов) строки (кортежа).?

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Это может быть выполнено на уровне MySql. Эта концепция известна как upsert.

случай, когда: первичный ключ новый SQL будет вставить в MySQL DB как новую строку

Случай, когда: первичный ключ существует Вы можете использовать

INSERT
ON DUPLICATE KEY UPDATE

, который обновит ключ новыми записями / изменения.

Подробнее здесь и here.

Идеальный способ для такого варианта использования - вставить данные во временную таблицу сначала в вашей MySQL БД и публикации, которые используют триггер для загрузки этих данных в исходную таблицу. Вызов этого триггера из самой искры.

0 голосов
/ 04 августа 2020

В Spark фреймы данных неизменяемы. Таким образом, вы не можете изменить значение на месте. Один из способов - прочитать всю таблицу, внести изменения и записать полную таблицу в режиме перезаписи. На это потребуется время. Если ваши изменения всегда относятся к определенной группе, скажем, на основе идентификатора пользователя или даты, вы можете записать данные на основе этого столбца с помощью partitionBy (). Затем вы можете прочитать этот раздел с помощью .filter (), сделать изменения и перезаписать только этот раздел с помощью insertInto () - из pyspark 2.3.0. Обратитесь к этому ответу для других версий для pyspark: Перезаписать определенные разделы c в искровом фрейме данных метод записи

...