这是我在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)