[英]Type mismatch in Spark UDF
我创建了以下UDF来仅获取十进制值的第一部分。
def udf_cleansing(col1 : Double) = udf((col1 : Double) => {
val col2 : String = f"$col1%.5f"
if(col2.trim == "" || col2 == null ) 0.toString else col2.substring(0,col2.indexOf("."))}
)
但是,在使用命令调用此函数时
df_aud.select(udf_cleansing(df_aud("HASH_TTL")))
我得到了以下错误: -
<console>:42:错误:类型不匹配;
发现:org.apache.spark.sql.Column
要求:双倍
df_aud.select(udf_cleansing(df_aud( “HASH_TTL”)))
我试着用命令
df_aud.withColumn("newc",udf_cleansing(df_aud("HASH_TTL").cast("double")))
仍然得到同样的错误。
原因是Scala将df_aud("HASH_TTL")
视为udf_cleansing
函数的参数,而不是将此函数返回给UDF。
相反,你应该写:
def udf_cleansing = udf(
(col1 : Double) => {
val col2 : String = f"$col1%.5f"
if(col2.trim == "" || col2 == null ) 0.toString else col2.substring(0,col2.indexOf("."))
}
)
现在udf_cleansing
返回一个UDF。 UDF1用作Column类型的参数,此列的值提供给包装的内部函数。
然后使用正是您尝试使用此功能的方式。
我建议你尽可能使用火花功能 。 如果任何内置函数无法满足您的需求,那么只有我建议您使用udf
函数,因为udf
函数需要序列化和反 序列化数据才能执行您设计的操作。
您的udf
功能可以通过使用进行format_string
和substring_index
如下内置功能
import org.apache.spark.sql.functions._
df_aud.select(substring_index(format_string("%.5f", df_aud("HASH_TTL")), ".", 1))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.