Как более эффективно собрать множество маленьких кадров данных в один большой? - PullRequest
0 голосов
/ 20 апреля 2020

Проблема

У меня есть рабочий код, и даже производительность достаточно для моих целей.

Фактическая проблема - потребление памяти .

Если несколько пользователей одновременно запускают код, память кластера Databricks заполняется быстро до тех пор, пока не выйдет из строя и не будет перезагружена.

Поскольку мы изменили код, чтобы использовать данные Spark, кадры потребляют память работает намного лучше в кластере.

Но теперь время обработки стало ужасно медленным, и я хотел бы выполнять обработку параллельно.

Вопрос

Но я не знаю, как к этому подойти.

Сначала я изучил семейство функций apply(), но они ожидают, что с этим будет работать фрейм данных, а затем он может быть обработан указанным пользователем. function.

В моем случае проблема, которую нужно решить, - это наоборот. У меня еще нет фрейма данных, я хочу построить его с моими данными.

Приведенный ниже код создает множество небольших фреймов данных , которые в конечном итоге необходимо объединить в один большой фрейм данных .

Так что я, кажется, смотрю на неправильные места.

=> Какой лучший R-подобный / искровой подход поможет обоим уменьшить объем памяти и обеспечить ее нормальную работу?

Код

Каждая генерируемая строка данных и столбец полностью независимы от других.

Мой текущий подход заключается в следующем:

  • Генерация данных каждого столбца.
  • Затем объединение их в фрейм данных.
  • Создание фрейма данных Spark на основе этого локального фрейма данных
  • Возвращает фрейм данных Spark.

Затем вызывающий код объединяет возвращенные фреймы данных с SparkR::union() в один фрейм данных.

Упрощенный пример:

Simulate <- function(someData) {

    data1 <- generator1(someData)
    data2 <- generator2()

    local_frame <- data.frame(
        column1 = data1,
        column2 = data2
      )

     spark_frame <- SparkR::createDataFrame(local_frame)

    return (spark_frame)
}
...