Я работал инженером данных и столкнулся с этой проблемой.
Я столкнулся со случаем использования, когда у меня есть представление (назовем его inputView), которое создается путем чтения данных из какого-то источника.
Теперь где-то позже в конвейере мне нужно снова прочитать данные из СУБД, создать представление (транзакции).
Затем я запускаю SQL-запрос Spark, чтобы объединить представление транзакций с входным представлением на основе некоторого столбца.
Проблема:
Проблема заключается в том, что должны загружаться только те данные, которые требуются от транзакций, но считываются все данные.
Предлагаемое решение (не уверен, что это безопасно)
Чтобы решить эту проблему, мы планируем создать временную таблицу в базе данных и сохранить inputView в RDBMS, затем выполнить соединение на уровне базы данных и получить данные.
Но при таком подходе проблема, похоже, заключается в том, что
1. Временные данные доступны только для каждого сеанса. Исполнители Spark будут иметь отдельный сеанс при вставке данных inputView в базу данных. Итак, как они собираются читать данные после присоединения, поскольку API искровой записи создаст данные записи сеанса, а затем закроет сеанс. Данные исчезнут еще до выполнения запроса на соединение.
2. Если я пишу каждую запись одну за другой из драйвера, используя JDBCprepreStatements. Затем для выполнения соединения и чтения данных мне нужно использовать одно и то же соединение для чтения данных, я не могу использовать API искрового чтения для их чтения. Поэтому я читаю данные только с помощью JDBC, что в конечном итоге загрузит все данные в драйвер, что может вызвать OOM.
3. Предположим, что работает несколько конвейеров и несколько конвейеров пытаются вставить свои данные inputView в некоторую временную таблицу. База данных будет получать большую нагрузку. Не произойдет ли сбой?
Любые предложения/решения приветствуются.
Заранее спасибо.
Подробнее здесь: https://stackoverflow.com/questions/798 ... java-spark