我正在我的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…
答案 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|
// +---+--------+--------------------+---------+