Быстрое разделение Spark-кадра данных по ключам в некотором столбце и сохранение в виде различных кадров данных - PullRequest
0 голосов
/ 09 мая 2019

У меня 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 нежелательно, если это возможно).

1 Ответ

1 голос
/ 09 мая 2019

Вам нужно разделить по столбцам и сохранить как CSV-файл. Каждый раздел сохранить как один файл.

yourDF
  .write
  .partitionBy("col_key")
  .csv("/path/to/save")

Почему бы тебе не попробовать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...