Вот еще один способ, основанный на функции DataFrame map
и предопределенном наборе правил rules
:
import spark.implicits._
import scala.util.matching.Regex
val df = Seq(
("STRING MATCHES SSS rule1"),
("STRING MATCHES SSS rule1"),
("STRING MATCHES SSS rule1"),
("STRING MATCHES SSS rule2"),
("STRING MATCHES SSS rule2"),
("STRING MATCHES SSS rule3"),
("STRING MATCHES SSS rule3"),
("STRING MATCHES SSS rule6"),
("STRING MATCHES SSS ruleXXX")
).toDF("desc")
val rules = Map(
"m1" -> List("rule1".r, "rule2".r),
"m2" -> List("rule3".r),
"m3" -> List("rule6".r)
)
df.map{r =>
val desc = r.getString(0)
val merchant = rules.find(_._2.exists(_.findFirstIn(desc).isDefined)) match {
case Some((m : String, _)) => m
case None => null
}
(merchant, desc)
}.toDF("merchant", "desc").show(false)
Вывод:
+--------+--------------------------+
|merchant|desc |
+--------+--------------------------+
|m1 |STRING MATCHES SSS rule1 |
|m1 |STRING MATCHES SSS rule1 |
|m1 |STRING MATCHES SSS rule1 |
|m1 |STRING MATCHES SSS rule2 |
|m1 |STRING MATCHES SSS rule2 |
|m2 |STRING MATCHES SSS rule3 |
|m2 |STRING MATCHES SSS rule3 |
|m3 |STRING MATCHES SSS rule6 |
|null |STRING MATCHES SSS ruleXXX|
+--------+--------------------------+
Объяснение:
rules.find(...
из правил найдите пару ключ / значение
_._2.exists(...
, значение которой имеет регулярное выражение
_.findFirstIn(desc).isDefined
, совпадающее с desc
case Some((m : String, _)) => m
и извлечение ключа из этой пары
PS: я не уверен, что Вы имеете в виду совпадение с регулярным выражением может быть выполнено параллельно, а не последовательно , так как функция отображения в приведенном выше решении будет выполняться параллельно. Уровень распараллеливания зависит от выбранного номера раздела. Добавление дополнительного распараллеливания внутри функции карты, например, в виде потока (или Scala Futures), безусловно, усложнит код без увеличения производительности. Это потому, что если вы создаете большое количество потоков, более вероятно, что вы создадите узкое место для ЦП вместо ускорения вашей программы. Spark - эффективная распределенная система, и нет необходимости искать альтернативы в отношении параллельного выполнения.