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