Это невозможно. На данный момент (Spark 1.6.0 / 2.2.0 SNAPSHOT) Spark DataFrameWriter
поддерживает только четыре режима записи:
blockquote>
SaveMode.Overwrite
: перезаписать существующие данные.SaveMode.Append
: добавьте данные.SaveMode.Ignore
: проигнорируйте операцию (т. е. нет-op).SaveMode.ErrorIfExists
: параметр по умолчанию, выдайте исключение в runtime.Вы можете вставить вручную, например, с помощью
mapPartitions
(так как вы хотите, чтобы операция UPSERT была идемпотентной и как такая простая в использовании), напишите во временную таблицу и выполнить перезагрузку вручную или использовать триггеры.В целом достижение поведения при перезагрузке для пакетных операций и поддержание достойной производительности далеко не тривиально. Вы должны помнить, что в общем случае будет выполняться несколько параллельных транзакций (по одному на каждый раздел), поэтому вы должны убедиться, что конфликты записи не будут (как правило, с использованием конкретного раздела) или предоставить соответствующие процедуры восстановления. На практике может быть лучше выполнить и пакетную запись во временную таблицу и разрешить часть upsert непосредственно в базе данных.