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

时间:2019-04-09 21:41:04

标签: sql scala apache-spark 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…

1 个答案:

答案 0 :(得分:2)

考虑使用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|
// +---+--------+--------------------+---------+