2015-06-05 2 views
2

У меня есть файл, который содержит много документов, как я могу пропустить те строки длиной < = 2, а затем обрабатывать строки длиной> 2. например :Пропуск некоторых строк по их длине в Scala и Spark

fit perfectly clie . 
purchased not 
instructions install helpful . improvement battery life not hoped . 
product. 
cable good not work . cable extremely hot not recognize devices . 

после пропуска строки:

fit perfectly clie . 
instructions install helpful . improvement battery life not hoped . 
cable good not work . cable extremely hot not recognize devices . 

мой код:

val Bi = text.map(sen=> sen.split(" ").sliding(2)) 

Есть ли решение для этого?

+0

Хорошо, так какой у курса есть задание о битрамах? Это, безусловно, часть той же проблемы, что и несколько вопросов от других людей ... –

+0

Я согласен @Paul. Я ответил немногим из них. –

ответ

2

Я хотел бы использовать фильтр:

> val text = sc.parallelize(Array("fit perfectly clie .", 
           "purchased not", 
           "instructions install helpful . improvement battery life not hoped .", 
           "product.", 
           "cable good not work . cable extremely hot not recognize devices .")) 

> val result = text.filter{_.split(" ").size > 2} 
> result.collect.foreach{println} 

fit perfectly clie . 
instructions install helpful . improvement battery life not hoped . 
cable good not work . cable extremely hot not recognize devices . 

Отсюда, вы можете работать с вашими данными в их первоначальном виде (т.е. не лексемы) после фильтрации. Если вы предпочитаете разметить первый, то вы можете сделать это:

text.map{_.split(" ")}.filter{_.size > 2} 

Итак, наконец, разметить, затем процеживают, а затем найти биграмм с sliding, вы будете использовать:

text.map{_.split(" ")}.filter{_.size > 2}.map{_.sliding(2)} 
+0

Также обратите внимание, что для проверки ваших данных в REPL после этой последней команды полезно добавить '.toList' внутри последняя карта после 'скольжения (2)' перед 'collect'ing. – ohruunuruus

2

Как насчет flatMap

text.flatMap(line=>{ 
    val tokenized = line.split(" ") 
    if(tokenized.length > 2) Some(tokenized.sliding(2)) 
    else None 
}) 
+0

Это должно быть 'else None' (т. Е. Без круглых скобок), но в остальном мне нравится комбинация отображения и фильтрации за одну операцию. Любая идея, как это сравнивается с 'map', а затем' filter' относительно производительности? – ohruunuruus

+0

@ohruunuruus Упс, спасибо за улов. Что касается производительности. Spark соединит карту/фильтр в одну задачу, поэтому я думаю, что самая большая победа будет читабельна. Если вы сделаете это так, оцените его! –

+0

Yep, просто ждал исправления до выключения;) – ohruunuruus