Перезаписать только некоторые разделы в многораздельном наборе данных spark - PullRequest
0 голосов
/ 24 апреля 2018

Как мы можем перезаписать многораздельный набор данных, но только те разделы, которые мы собираемся изменить? Например, пересчет ежедневной работы за последнюю неделю и перезапись только данных за последнюю неделю.

По умолчанию Spark перезаписывает всю таблицу, даже если будут записаны только некоторые разделы.

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Только к сведению, для пользователей PySpark обязательно установите overwrite=True в insertInto, иначе режим будет изменен на append

из исходного кода :

def insertInto(self, tableName, overwrite=False):
    self._jwrite.mode(
        "overwrite" if overwrite else "append"
    ).insertInto(tableName)

вот как это использовать:

spark.conf.set("spark.sql.sources.partitionOverwriteMode","DYNAMIC")
data.write.insertInto("partitioned_table", overwrite=True)

или в версии SQL работает нормально.

INSERT OVERWRITE TABLE [db_name.]table_name [PARTITION part_spec] select_statement

для просмотра документа здесь

0 голосов
/ 24 апреля 2018

Начиная с Spark 2.3.0, эта опция используется при перезаписи таблицы.Чтобы перезаписать его, вам нужно установить новую настройку spark.sql.sources.partitionOverwriteMode на dynamic, набор данных должен быть разбит на части, а режим записи overwrite.Пример:

spark.conf.set(
  "spark.sql.sources.partitionOverwriteMode", "dynamic"
)
data.write.mode("overwrite").insertInto("partitioned_table")

Я рекомендую сделать перераспределение на основе столбца вашего раздела перед записью, чтобы у вас не было 400 файлов в папке.

До Spark 2.3.0,Лучшим решением было бы запустить операторы SQL для удаления этих разделов, а затем записать их с помощью режима добавления.

...