2015-09-28 2 views
1

В приведенном ниже коде я пытаюсь прочитать текстовый файл как rdd, и я вызываю метод map, потому что я хочу перенести каждую строку и добавить ее в объект String Builder. Но я хочу вернуть объект String Builder после того, как я закончил с каждой строкой. Но здесь я возвращаю его в каждой строке. Поэтому, когда я делаю exposuresRdd.saveAsTextFile().Как вернуть объект String Builder сразу как rdd? Или преобразовать объект String Builder в rdd?

Я получаю результат, как (повторы) б

б с

б с d

, где, как я хочу, чтобы это было в b c d e f

Он не должен повторять

JavaRDD<String> exposuresRdd = ctx.textFile(fname); 

JavaRDD<String> transformedrdd= exposuresRdd.flatMap(new Function<String, String>() { 

     @Override 
     public String call(String line) throws Exception { 
sb.append(Something); 
return sb.toString(); 

}); 
} 
+0

Я не понимаю здесь вопроса - если вы хотите вернуть строку в конце каждой строки, то вывод будет повторением предыдущих строк + новой строки. Также наверняка вы бы сохранили transformRdd, а не exposuresRdd.saveAsTextFile()? – Gillespie

+0

Пожалуйста, [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). Неясно, чего вы хотите, и ваш код является неполным. Похоже, вы делаете точно такую ​​же ошибку, как [здесь] (http://stackoverflow.com/q/32798554/1560062) – zero323

ответ

0

Прежде всего в конце я хотел бы сохранить transformedRdd.saveAstextFile(), а не exposuresRdd как говорит Гиллеспи.

Мне удалось решить проблему повторения данных с помощью нового объекта String Builder, когда-либо возвращающего строку.

Как и в случае с тем же объектом String Builder, он уже содержит предыдущие строки, добавленные к нему, я получал повторяющиеся данные на своем конечном выходе.

JavaRDD<String> exposuresRdd = ctx.textFile(fname); 

StringBuilder sb = null; 
JavaRDD<String> transformedrdd= exposuresRdd.flatMap(new Function<String,String>() { 

    @Override 
    public String call(String line) throws Exception { 
sb = new StringBuilder(); 
sb.append(Something); 
return sb.toString(); 

}); 
} 

Это позволит убедиться, что каждый раз, когда вы возвращаете объект StringBuilder будет иметь только данные, приложенные к нему в тот конкретный вызов. Выхода сейчас будет -> ABCDEF
Если мы используем один и тот же объект StringBuilder для всех вызовов, выход был бы -> а
аб а ABCD ABCDE ABCDEF
(из-за данные, приложенных к StringBuilder в предыдущих вызовах.)