У меня Spark 2.3 очень большой фрейм данных:
-------------------------
| col_key | col1 | col2 |
-------------------------
| AA | 1 | 2 |
| AB | 2 | 1 |
| AA | 2 | 3 |
| AC | 1 | 2 |
| AA | 3 | 2 |
| AC | 5 | 3 |
-------------------------
Мне нужно «разделить» этот кадр данных по значениям в столбце col_key и сохранить каждую разделенную часть в отдельном файле csv, поэтому мне нужно получить меньшие кадры данных, например
-------------------------
| col_key | col1 | col2 |
-------------------------
| AA | 1 | 2 |
| AA | 2 | 3 |
| AA | 3 | 2 |
-------------------------
и
-------------------------
| col_key | col1 | col2 |
-------------------------
| AC | 1 | 2 |
| AC | 5 | 3 |
-------------------------
и до сих пор.
Каждый результирующий кадр данных мне нужно сохранить в виде другого файла CSV.
Количество ключей невелико (20-30), но общее количество данных составляет (~ 200 миллионов записей).
У меня есть решение, где в цикле выбираются все части данных, а затем сохраняются в файл:
val keysList = df.select("col_key").distinct().map(r => r.getString(0)).collect.toList
keysList.foreach(k => {
val dfi = df.where($"col_key" === lit(k))
SaveDataByKey(dfi, path_to_save)
})
Это работает правильно, но проблема этого решения в том, что каждый выбор данных каждым ключом может проходить через весь фрейм данных, и это занимает слишком много времени.
Я думаю, что должно быть более быстрое решение, когда мы пропускаем через фрейм данных только один раз, и во время этого каждую запись помещаем в «точный» фрейм данных результата (или непосредственно в отдельный файл). Но я не знаю, как это сделать :)
Может быть, у кого-то есть идеи по этому поводу?
Также я предпочитаю использовать API Spark DataFrame, поскольку он обеспечивает самый быстрый способ обработки данных (поэтому использование RDD нежелательно, если это возможно).