#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:
- Spark будет выполнять
insert
запросы параллельно в независимых транзакциях, и именно поэтому иногда вы находите данные в случае ошибки, а иногда и нет. Возможно, что порядок вставки не одинаков в каждом случае. Spark автоматически создаст запрос на основе значения, котороеspark.sql.shuffle.partitions
будет значением по умолчанию200
или если вы использовалиdf.repartition(val)
. Таким образом, на основе конфигурации и доступных разделов, он будет выполнять запрос вставки параллельно, имея независимые транзакции для каждого раздела. Если возникнет какая-либо ошибка, это остановит выполнение. - Чтобы ответить на ваш другой вопрос, вы выполняете запросы на
MySQL
soSpark
, который не имеет никакого контроля над ним. Таким образом,NO
не может быть способа, которым вы можете игнорировать такие ошибки DML. Spark выполнит запрос, как и любая другая внешняя система. Разработчик должен нести ответственность за то, чтобы данные имели ожидаемую длину и формат. Вы всегда можете преобразовать данные в ожидаемый формат перед записью вMySQL
.
Для получения дополнительной информации обратитесь к этому.
Комментарии:
1. в MYSQL у нас есть что-то вроде INSERT IGNORE , можем ли мы иметь аналогичную вещь здесь?
2. Насколько мне известно, я не думаю, что это возможно из коробки spark.