Добро пожаловать в переполнение стека
Метод 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 специальных символов, второй - количество строк, содержащих как минимум верхний регистр, третий - количество строк, содержащих как минимум нижний регистр персонаж.