[英]Spark Int and Integer, udf
我刚刚开始学习Spark。 我试图为我的数据框定义一个UDF。 这是一个非常简单的函数,例如:column是数据框中的Long类型。
def category: (Int => Int) ={ a=>
if(a<7){
return a
}
else{
if(a>=7 && a<14){
return 8
}
else{
if(a>=14 && a<28){
return 9
}
else{
return 10
}
}
}
}
import org.apache.spark.sql.functions.udf
val myudf = udf(category)
val df_1 = df.withColumn("ncol", myudf($col))
它总是报告错误:
:78: error: type mismatch; found : Int required: Int => Int return a ^ :82: error: type mismatch; found : Int(8) required: Int => Int return 8 ^ :86: error: type mismatch; found : Int(9) required: Int => Int return 9 ^ :89: error: type mismatch; found : Int(10) required: Int => Int return 10 ^
摆脱您的退货声明。 在大多数Scala代码中, return
都是不必要的,因为最后一个表达式是自动返回的(这对于if语句也适用,整个if都是返回值的语句)。 不建议您在不必使用return
时使用它,因为它可能导致某些意外行为,例如您在此处遇到的情况。
让我们简化您的代码
def category: (Int => Int) ={ a=>
return a
}
这将无法编译。 category
是一种不带参数的方法,它返回一个函数Int => Int
。 到现在为止还挺好。 但现在return a
使返回的值的方法a
,这是一个Int
。 之所以中断,是因为我们想要和Int => Int
并返回Int
。 要解决此问题,只需删除退货即可。
def category: (Int => Int) = { a=>
a
}
现在代码可以正常工作了,因为我们方法中的最后一个(也是唯一一个)表达式是函数a => a
,就像我们想要的那样,它是一个Int => Int
。 这里的函数有点无聊,它只返回输入而没有更改。
让我们尝试一下您的功能
def category: (Int => Int) ={ a=>
if(a<7){
a
}
else{
if(a>=7 && a<14){
8
}
else{
if(a>=14 && a<28){
9
}
else{
10
}
}
}
}
现在它起作用了,因为我们没有尝试从函数内部返回Int
,而是返回了我们想要的整个函数。
鉴于列类型为Long
,则您的category
方法应采用Long
参数而不是Int
。 这是我定义函数的方式:
def category: (Long => Long) = { a =>
if (a < 7) a else
if (a < 14) 8 else
if (a < 28) 9 else
10
}
val myudf = udf(category)
或者,您可以只在一个代码块中创建UDF
:
val myudf = udf(
(a: Long) =>
if (a < 7) a else
if (a >= 7 && a < 14) 8 else
if (a >= 14 && a < 28) 9 else
10
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.