Ну, это зависит. В общем, вы должны предположить, что это поведение является недетерминированным, если это явно не предусмотрено вашим приложением и дизайном базы данных.
По умолчанию Spark будет извлекать данные каждый раз, когда вы выполняете действие в соответствующем наборе данных Spark. Это означает, что каждое исполнение может видеть различное состояние вашей базы данных.
Такое поведение может зависеть от нескольких факторов:
- Явное кэширование и возможные выселений кэш.
- Неявное кэширование с файлами в случайном порядке.
- Точный набор параметров, которые вы используете с источником данных JDBC.
В первых двух случаях Spark может повторно использовать уже извлеченные данные, не возвращаясь к исходному источнику данных. Третий интереснее. По умолчанию Spark извлекает данные с использованием одной транзакции, но есть методы, которые позволяют выполнять параллельное чтение на основе диапазонов столбцов или предикатов. Если один из них используется, Spark будет извлекать данные с использованием нескольких транзакций, и каждый может наблюдать за другим состоянием вашей базы данных.
Если требуется целостное время семантики у вас есть в основном два варианта:
- Используйте неизменные, дописать в конце и датируемые записи в базе данных и выдача временных меток зависимых запросах от Спарка.
- Выполнение согласованных дампов базы данных и использование их в качестве прямого ввода ваших заданий Spark.
В то время как первый подход гораздо более мощный, его гораздо сложнее реализовать, если вы работаете с существующей архитектурой.
Вы можете объяснить вопрос кодом? – mrsrinivas