我正在使用Spark 2.2,我想知道在性能方面删除DataFrame
列的后缀的最佳选择是什么
使用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根据用户8983815的回答进行更新]
我写了一个基准测试,结果有点令人惊讶
[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
2条答案
按热度按时间kjthegm61#
我怀疑
regexp_replace
是否会导致严重性能问题,但如果您真的关心用作:
qhhrdooz2#
如果转换为DataSet并执行以下操作,情况会怎样:
例如: