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

问题描述 投票:0回答:1

我正在我的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…
sql scala apache-spark dataframe
1个回答
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|
// +---+--------+--------------------+---------+
© www.soinside.com 2019 - 2024. All rights reserved.