2014-10-23 3 views
0

Я хотел бы написать программу Spark, которая анализирует файл журнала csv, разделяет слова на разделитель ";" и создает объект, значения атрибута которого являются словами, расположенными на определенных позициях. Код будет выглядеть так в Scala, но у меня возникнут проблемы с переводом на Java 1.8 (я хотел бы использовать лямбда-выражения в Java).От Scala до Java 1.8

val file = sc.textFile("hdfs:/../vrLogs.csv") 
class VREvent(val eventTimestamp: String, val deviceID: String, val eventType: String, val itemGroupName: String) 
val vrEvents = file.map(_.split(';')).filter(_.size == 32).map(a => new VREvent(a(0), a(1), a(6), a(13))) 

Я не знаю, как перевести эту часть в Java: .map(a => new VREvent(a(0), a(1), a(6), a(13))).

Я попробовал это (без части фильтра):

JavaRDD<String> records = lines.flatMap(s -> Arrays.asList(s.split(";"))).map(a -> new CDREvent(a[0], a[1], a[6], a[13])); 
+0

, пожалуйста, отформатируйте свой код! –

+0

Итак, вы просите эквивалент метода «map» в Java 1.8, правильно? –

+0

Извините за формат, я набрал слишком быстро. Я прошу эквивалент этого: «.map (a => новый VREvent (a (0), a (1), a (6), a (13)))» в Java 1.8. Благодаря! – marlieg

ответ

3

Предполагая, что lines является Stream<String>:

List<CDREvent> events = 
    lines 
     .map(s -> s.split(";")) 
     .filter(a -> a.length == 32) 
     .map(a -> new CDREvent(a[0], a[1], a[6], a[13])) 
     .collect(Collectors.toList()); 

Карта каждую строку в String[], отфильтровать все массивы, которые не являются длины 32, сопоставьте каждый String[] с номером CDREvent и соберите их в новом списке.

+1

Спасибо @DavidConrad, это решает мою проблему и помогает мне лучше понять, как это работает! – marlieg

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