我正在使用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 s速度很慢,但是评估每一行的REGEXP的速度更快?
[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
我怀疑 regexp_replace
是否会引起严重的性能问题,但是如果您真的很关心
import org.apache.spark.sql.functions._
import org.apache.spark.sql.Column
def removeSuffix(c: Column) = when(c.endsWith("XXX"), c.substr(lit(0), length(c) - 3)).otherwise(c)
用作:
scala> Seq("fooXXX", "bar").toDF("s").select(removeSuffix($"s").alias("s")).show
+---+
| s|
+---+
|foo|
|bar|
+---+
如果您投射到数据集并做:
怎么样,例如
case class InputData(col1: String, col2: String)
case class OutputData(col1: String, col2: String)
val suffix = "."
def clean(i: InputData): OutputData = {
OutputData(
col1 = i.col1.stripSuffix(suffix).toLowerCase,
col2 = i.col2,
)
}
df.as[InputData].map(clean).toDF