У меня есть база данных MySQL с одной таблицей, содержащей около 100 миллионов записей (~ 25 ГБ, ~ 5 столбцов). Используя Apache Spark, я извлекаю эти данные через соединитель JDBC и сохраняю их в DataFrame. Отсюда я выполняю некоторую предварительную обработку данных (например, заменяю значения NULL), поэтому мне абсолютно необходимо просмотреть каждую запись. Затем я хотел бы выполнить уменьшение размерности и выбор функций (например, с помощью PCA), выполнить кластеризацию (например, K-Means), а затем провести тестирование модели на новых данных.
Я реализовал это в Java API Spark, но это слишком медленно (для моих целей), поскольку я много копирую данные из DataFrame в java.util.Vector и java.util.List (чтобы иметь возможность перебирать все записи и выполнять предварительную обработку), а затем обратно в DataFrame (поскольку PCA в Spark ожидает DataFrame в качестве входных данных).
Я попытался извлечь информацию из базы данных в org.apache.spark.sql.Column, но не могу найти способ перебрать ее. Я также пытался избежать использования структур данных Java (таких как List и Vector), используя org.apache.spark.mllib.linalg. {DenseVector, SparseVector}, но не могу заставить это работать. Наконец, я также рассматривал возможность использования JavaRDD (путем создания его из DataFrame и настраиваемой схемы), но не смог полностью его решить.
После длинного описания у меня вопрос: есть ли способ выполнить все шаги, упомянутые в первом абзаце, без копирования всех данных в структуру данных Java? Возможно, один из вариантов, который я попробовал, действительно сработает, но я просто не могу понять, как это сделать, поскольку документации и литературы по Spark немного.