数据帧过滤出包含指定单词的行(字符串)



这是我在Scala中的问题。我有一个数据帧,其中一列的数据类型是字符串。例如,该列有4个值

"Abc", "dfea", "skjod", "aaa"

List = ["ab", "kj"]

我需要过滤掉列表中包含任何值的行。因此,对于上面的数据,我将获得第二行和第四行。

这是我的代码:

val del_blk = (arg: String) => {
for (word <- list) {
if (arg.contains(word)) 1
}
0
} 
val blkUDF = udf(del_blk)
df
.withColumn("blk", blkUDF(col("col")))
.filter(col("blk") === 0)
.select("col")
.show()
val del_blk = (arg: String) => {
for (word <- list) {
if (arg.contains(word)) 1
}
0
}

相当于

val del_blk = (arg: String) => {
list.foreach(word => if (arg.contains(word)) 1)
0
}

我怀疑你更倾向于

def containsForbiddenWord(word: String): Boolean =
list.exists(forbidden => word.contains(forbidden))

最好不要在spark中使用udfs,因为它们没有优化,而且速度很慢。您可以使用spark SQL执行以下操作:

df.withColumn("blk", col("col").isin(list :_*))
.filter(col("blk") === false)

最新更新