Добавить элементы в RDD .filter или создать метод? - PullRequest
1 голос
/ 30 апреля 2019

Я хотел бы отфильтровать TXT-файл для создания СДР и создания статистики. Метод фильтра (.filter) позволил мне создать СДР, но я ограничиваюсь, потому что мои компетенции очень ограничены.

Il хотел бы посчитать количество слов, которые содержат:

special characters >=3
uppercase >=1
lowercase >=1

Пример использования фильтра:

   scala> val data = sc.textFile("file.txt") 
   scala> val specialChars = List('*', '@', '&', '=', '#', '?', '!', '%', '+', '-', '<', '>', ' ', ',', '_', '$', '"', '[', ']', ';', ''', '(', ')', '.', '/') 
   scala> val upper = List('A' to 'Z')
   scala> val lower = List('a' to 'z')           
   scala> val data_low = data.filter(_.length < 13).filter(line => !specialChars.exists(char => line.contains(char)))

Вот мой другой подход, но я не знаю, как реализовать результат (здесь проиллюстрирован println) в СДР.

scala> for (line <- data) {
     | var spe_sum = 0;
     | for (c <- specialChars) {
     | spe_sum = spe_sum + line.count(_ == c);
     | }
     | if (spe_sum >= 3 & nombre.exists(char => line.contains(char)) & maj.exists(char => line.contains(char)) & minus.exists(char => line.contains(char))) {
     | println(line);
     | }
     | }

Можно ли выполнить мой код в .filter или записать .filter, которые дают тот же результат?

1 Ответ

3 голосов
/ 30 апреля 2019

Добро пожаловать в переполнение стека

Метод filter перебирает предоставленный вами Список и проверяет каждый элемент коллекции с помощью предоставляемой вами функции. Ваша функция должна возвращать true или false, а filter возвращает элементы списка, где ваша функция возвращает true. Таким образом, в принципе, вы не можете использовать фильтр для подсчета элементов в коллекции.

Способ достижения вашего результата заключается в следующем

val rdd: RDD[String] = // load your RDD and tokenize each word
val specialChars = List('*', '@', '&', '=', '#', '?', '!', '%', '+', '-', '<', '>', ' ', ',', '_', '$', '"', '[', ']', ';', ''', '(', ')', '.', '/')
val upper = ('A' to 'Z')
val lower = ('a' to 'z')

// count the words satysfying all constraints
rdd.map(_.toList) // map each word to a list of chars
   .filter(x => specialChars.intersect(x).size > 2 && upper.intersect(x).nonEmpty && lower.intersect(x).nonEmpty)
   .count()

// count the words that satisfies at least a constraint
rdd.map(_.toList)
   .map(x => // map each word to a tuple of three elements, each element is to 1 if it satisfies the respective constraint
             (if (specialChars.intersect(x).size > 2) 1 else 0, // check the intersection with special characters
              if (upper.intersect(x).nonEmpty) 1 else 0,  // check the intersection with upper-case characters
              if (lower.intersect(x).nonEmpty) 1 else 0)) // check the intersection with lower-case characters
   .reduce((a, b) => (a._1 + b._1, a._2 + b._2, a._3 + b._3)) // sum up the results

Первый элемент результирующего кортежа - это количество строк, содержащих более 3 специальных символов, второй - количество строк, содержащих как минимум верхний регистр, третий - количество строк, содержащих как минимум нижний регистр персонаж.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...