Параметры PySpark и MySQL

#mysql #apache-spark #pyspark

#mysql #apache-spark #pyspark

Вопрос:

Я хочу записать в БД, используя pyspark, как показано ниже

 df.write.format("jdbc").option("url", jdbc_url).option("driver", "com.mysql.jdbc.Driver")
          .option("dbtable", table).option("user", user).option("password", password)
          .mode('append').save()

  

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

Также есть ли какой-либо вариант, при котором я могу писать, игнорируя ошибки DML, такие как проблемы с длиной столбца или проблемы с форматом даты и т.д.

Ответ №1:

  1. Spark будет выполнять insert запросы параллельно в независимых транзакциях, и именно поэтому иногда вы находите данные в случае ошибки, а иногда и нет. Возможно, что порядок вставки не одинаков в каждом случае. Spark автоматически создаст запрос на основе значения, которое spark.sql.shuffle.partitions будет значением по умолчанию 200 или если вы использовали df.repartition(val) . Таким образом, на основе конфигурации и доступных разделов, он будет выполнять запрос вставки параллельно, имея независимые транзакции для каждого раздела. Если возникнет какая-либо ошибка, это остановит выполнение.
  2. Чтобы ответить на ваш другой вопрос, вы выполняете запросы на MySQL so Spark , который не имеет никакого контроля над ним. Таким образом, NO не может быть способа, которым вы можете игнорировать такие ошибки DML. Spark выполнит запрос, как и любая другая внешняя система. Разработчик должен нести ответственность за то, чтобы данные имели ожидаемую длину и формат. Вы всегда можете преобразовать данные в ожидаемый формат перед записью в MySQL .

Для получения дополнительной информации обратитесь к этому.

Комментарии:

1. в MYSQL у нас есть что-то вроде INSERT IGNORE , можем ли мы иметь аналогичную вещь здесь?

2. Насколько мне известно, я не думаю, что это возможно из коробки spark.