Spark Scala使用UDF修改DataFrame特定字符串列值报错如何解决?
问题分析
- UDF绑定的函数参数定义错误:你定义的
modifyColumn为无参函数,但实际调用时传入了Periodicity列的每行值作为入参,函数需要接收1个字符串类型的入参承接每行的字段值。 - 取值逻辑错误:函数内部调用
df1.col("Periodicity")获取的是DataFrame的列对象,不是当前行的具体字段值,无法直接和字符串常量做相等判断,比较逻辑应该基于函数入参实现。 - 分支逻辑不完整:现有代码仅处理了值为
Annual的分支,没有覆盖Daily转义、其他值保留的逻辑,函数返回值类型不匹配,会直接触发运行时异常。
正确实现
自定义UDF实现
// 入参为每行Periodicity字段的具体字符串值 val modifyColumn = (period: String) => period match { case "Annual" => "EveryYear" case "Daily" => "EveryDay" case other => other // 未匹配到的取值保留原值 } val modifyColumnUDF = udf(modifyColumn) val result = df1.withColumn("Periodicity", modifyColumnUDF(df1.col("Periodicity")))
更高效的内置函数实现(无需自定义UDF)
如果只是简单的取值映射,使用Spark内置的when函数性能优于自定义UDF:
import org.apache.spark.sql.functions.when val result = df1.withColumn("Periodicity", when($"Periodicity" === "Annual", "EveryYear") .when($"Periodicity" === "Daily", "EveryDay") .otherwise($"Periodicity") )
内容的提问来源于stack exchange,提问作者Knack
相关产品推荐
相关产品推荐

