Поиск и подсчет вхождений слов в столбце данных / значении / строке - PullRequest
0 голосов
/ 10 апреля 2019

Я работаю над фреймом данных в моем приложении данных Spark / Scala, где один из столбцов в фрейме данных имеет огромные длинные строковые значения с пробелами или без них (возможны оба сценария) и множество других странных символов между ними, например: символы и цифры и т. д.

rawDF.select($"id", $"date", $"content").show()

Пример кадра данных (rawDF):

id  date        content
1   4/8/2019    CLM***120379893***John***CLM***Smith***blablabla**so..on…
2   4/8/2019    CLM***120379093***John***CLM***Smith***CLM***blablabla**so..on…
3   4/8/2019    CLM***139979893***John***Smith***blablabla**so..on…

Мне нужно выполнить поиск строки "CLM" в столбце $ "content" фрейма данных и добавить новый столбец с числом вхождений или количеством слов AS в столбце "wordcount".

val rawWordCountDF = rawDF.withColumn("wordcount", udf("content"))

Я перепробовал множество вариантов, но ни один из них не дал мне ожидаемого результата. Может ли кто-нибудь помочь мне с UDF, который может выдать следующий результат? Любая помощь или ссылки приветствуются. Благодаря.

id  date    wordcount   content
1   4/8/2019    2   CLM***120379893***John***CLM***Smith***blablabla**so..on…
2   4/8/2019    3   CLM***120379093***John***CLM***Smith***CLM***blablabla**so..on…
3   4/8/2019    1   CLM***139979893***John***Smith***blablabla**so..on…

1 Ответ

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

Рассмотрите возможность использования findAllIn , который сопоставляет шаблон Regex (который может быть буквальной подстрокой) со строкой:

import org.apache.spark.sql.functions._
import spark.implicits._

val df = Seq(
  (1, "4/8/2019", "CLM***120379893***John***CLM***Smith***blablabla**so..on…"),
  (2, "4/8/2019", "CLM***120379093***John***CLM***Smith***CLM***blablabla**so..on…"),
  (3, "4/8/2019", "CLM***139979893***John***Smith***blablabla**so..on…")
).toDF("id", "date", "content")

def countAll(pattern: String) = udf((s: String) => pattern.r.findAllIn(s).size)

df.withColumn("wordcount", countAll("CLM")($"content")).show
// +---+--------+--------------------+---------+
// | id|    date|             content|wordcount|
// +---+--------+--------------------+---------+
// |  1|4/8/2019|CLM***120379893**...|        2|
// |  2|4/8/2019|CLM***120379093**...|        3|
// |  3|4/8/2019|CLM***139979893**...|        1|
// +---+--------+--------------------+---------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...