繁体   English   中英

Spark UDF中键入不匹配

[英]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_stringsubstring_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM