在dataframe列值/字符串中搜索和计算单词出现次数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在dataframe列值/字符串中搜索和计算单词出现次数相关的知识,希望对你有一定的参考价值。

我正在我的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…

我需要在数据框的$“content”列中搜索字符串“CLM”,并添加一个包含出现次数或字数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…
答案

考虑使用匹配字符串的正则表达式模式(当然可以是文字子字符串)的findAllIn

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|
// +---+--------+--------------------+---------+

以上是关于在dataframe列值/字符串中搜索和计算单词出现次数的主要内容,如果未能解决你的问题,请参考以下文章

在 PySpark 数据框中拆分和计算列值

添加具有另一列值的 len() 的 DataFrame 列

Pandas DataFrame:使用列值在另一列中切片字符串

重命名python DataFrame的列值的子字符串

字符串列包含通过 spark scala 精确匹配的单词

Python:搜索单词中最长的回文和单词/字符串中的回文