2016-01-16 3 views
-2

Я посылаю вывод одной функции, которая является dataframe для другой функции.Как передать вывод одной функции другой в Spark

val df1 = fun1 
val df11 = df1.collect 
val df2 = df11.map(x =fun2(x,df3)) 

Выше 2 строки являются главными функциями. Df1 очень большой, поэтому, если я собираюсь на драйвере, он дает выход из памяти или gc. Какие r способов отправить вывод одной функции другой в искру?

+0

почему вы делаете оплаченный здесь? вы всегда можете сделать df1.map (x => fun2 (x)) – Knight71

+0

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

ответ

1

Spark может выполнять обработку данных для вас. Вам не нужен шаг промежуточного сбора. Вы должны просто объединить все преобразования вместе, а затем добавить действие в конце, чтобы сохранить полученные данные на диск.

Вызов collect() полезен только для отладки очень небольших результатов.

Например, вы могли бы сделать что-то вроде этого:

rdd.map(x => fun1(x)) 
    .map(y => fun2(y)) 
    .saveAsObjectFile(); 

Эта статья может быть полезна, чтобы объяснить подробнее об этом:

http://www.agildata.com/apache-spark-rdd-vs-dataframe-vs-dataset/

+0

Спасибо за ваш ответ. Тип возвращаемого значения .saveAsObjectFile() - это единица. Я делаю сбор, чтобы я мог вызывать функцию на df1. Если я не вызываю сбор, он дает исключение nullpointer. Я понимаю, что сбор не эффективен, если набор данных большой. Поэтому, если я вызываю .saveAsObjectFile(), мне нужно прочитать выходной файл для дальнейшей обработки? Пожалуйста, объясни. –

+0

Да. Если вам нужно использовать данные сохранения в будущем преобразовании, вы можете прочитать данные в новый фрейм данных. Что-то вроде: '' ' sparkContext.objectFile (путь) ' '' – andygrove

Смежные вопросы