我正在使用Spark 2.2,并且想知道在性能方面,从数据框的列中删除后缀的最佳选项是什么。
可以使用UDF函数。
我知道 udf 通常被认为很慢,但是每一行评估一个正则表达式会更快吗? [2018-01-21 基于 user8983815 的回答进行更新] 我已经编写了一个基准测试,并且结果有点令人惊讶。
可以使用UDF函数。
val removeSuffix = udf { (id: String) =>
if (id != null && id.endsWith("XXX")) {
id.dropRight(3)
} else {
id
}
}
df.withColumn("c", udf("col"))
可以使用内置的regexp
函数。
df.withColumn("c", regexp_replace($"col", "XXX$", ""))
我知道 udf 通常被认为很慢,但是每一行评估一个正则表达式会更快吗? [2018-01-21 基于 user8983815 的回答进行更新] 我已经编写了一个基准测试,并且结果有点令人惊讶。
[info] Benchmark Mode Cnt Score Error Units
[info] RemoveSuffixBenchmark.builtin_optimized avgt 10 103,188 ± 3,526 ms/op
[info] RemoveSuffixBenchmark.builtin_regexp_replace_ avgt 10 99,173 ± 7,313 ms/op
[info] RemoveSuffixBenchmark.udf avgt 10 94,570 ± 5,707 ms/op
对于那些感兴趣的人,代码在这里:https://github.com/YannMoisan/spark-jmh