Я использую R в Zeppelin на работе для разработки моделей машинного обучения. Я извлекаю данные из таблиц Hive, используя %sparkr, sql(Constring, 'select * from table')
, и по умолчанию он создает фрейм данных spark с 94 миллионами записей.
Однако я не могу выполнять все задачи по обработке данных R в этом Spark df, поэтому я пытаюсь преобразовать его во фрейм данных R с помощью Collect(), as.data.frame()
, но я столкнулся с проблемами узла памяти/тайм-аута.
Мне было интересно, известно ли сообществу переполнения стека какой-либо другой способ преобразования Spark df в R df избегая проблем с тайм-аутом?
Преобразование кадра данных Spark в кадр данных R
- Это по определению то, что требуется для R dataframe. 09.08.2018
- что делать, если время преобразования истекло? 09.08.2018
- Тогда вам не следует использовать их. Вы можете скорее проверить методы
gapply
илиdapply
, которые работают с фрагментами данных распределенным образом. 09.08.2018 - Как насчет использования пакета sparklyr, каких-либо входных данных? 09.08.2018
- Давайте продолжим обсуждение в чате. 09.08.2018
- Sparklyr не сильно отличается — он просто добавляет еще один уровень косвенности, притворяясь, что Spark — это база данных. 09.08.2018
Ответы:
Вы пытались сначала кэшировать свой искровой фрейм данных? Если вы сначала кэшируете свои данные, это может помочь ускорить сбор, поскольку данные уже находятся в ОЗУ... это может решить проблему тайм-аута. В то же время это только увеличит ваши требования к оперативной памяти. Я тоже видел эти проблемы с тайм-аутом, когда вы пытаетесь сериализовать или десериализовать определенные типы данных или просто большие объемы данных между R и Spark. Сериализация и десериализация больших наборов данных — это далеко не «пуленепробиваемая» операция с R и Spark. Более того, 94M записей может быть слишком много для вашего узла драйвера, особенно если в вашем наборе данных много измерений.
Один обходной путь, который я использовал, но не горжусь им, заключается в том, чтобы использовать spark для записи фрейма данных в виде CSV, а затем заставить R прочитать этот CSV-файл обратно в следующей строке скрипта. Как ни странно, в нескольких случаях, когда я делал это, метод записи файла и чтения файла на самом деле оказывался быстрее, чем простая операция collect
. Намного быстрее.
Совет — следите за секционированием при записи CSV-файлов с помощью spark. Вы получите кучу CSV-файлов и должны будете выполнить какую-то операцию tmp<- lapply(list_of_csv_files_from_spark, function(x){read.csv(x)})
для чтения в каждом CSV-файле по отдельности, а затем, возможно, df<- do.call("rbind", tmp)
... вероятно, было бы лучше использовать fread
для чтения в CSV вместо read.csv
также.
Возможно, лучше спросить, какие другие задачи по обработке данных вы не можете выполнить в Spark, для которых вам нужен R?
Удачи. Я надеюсь, что это было полезно. -нейт