Scala Spark Int和Integer,udf
我刚开始学火花。我试图为我的数据帧定义一个自定义项。这是一个非常简单的函数,如下所示:column是dataframe中的Long类型Scala Spark Int和Integer,udf,scala,apache-spark,Scala,Apache Spark,我刚开始学火花。我试图为我的数据帧定义一个自定义项。这是一个非常简单的函数,如下所示:column是dataframe中的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)
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))
def类别:(Int=>Int)={a=>
如果(a=7&&a=14&&a整数
归还
^
:82:错误:类型不匹配;
发现:Int(8)
必需:Int=>Int
返回8
^
:86:错误:类型不匹配;
发现:Int(9)
必需:Int=>Int
返回9
^
:89:错误:类型不匹配;
发现:Int(10)
必需:Int=>Int
返回10
^
鉴于列类型为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)
鉴于列类型为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)
去掉返回语句。return
在大多数scala代码中都是不必要的,因为最后一个表达式是自动返回的(这也适用于if语句,整个if语句都是返回值的语句)。不建议在您不需要的情况下使用return
,因为它可能会导致您在此处遇到的一些意外行为
让我们简化您的代码
def category: (Int => Int) ={ a=>
return a
}
这将无法编译。category
是一个不带参数并返回函数Int=>Int
的方法。到目前为止还不错。但是现在returna
会导致该方法返回a
的值,这是一个Int
。这会中断,因为我们需要Int=>Int
并返回一个ode>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
}
}
}
}
def类别:(Int=>Int)={a=>
if(a=7&&a=14&&a摆脱返回语句。return
在大多数scala代码中是不必要的,因为最后一个表达式是自动返回的(这也适用于if语句,整个if语句都是返回值的语句)。不建议在您不需要的情况下使用return
,因为它可能会导致您在此处遇到的一些意外行为
让我们简化您的代码
def category: (Int => Int) ={ a=>
return a
}
这将无法编译。category
是一个不带参数并返回函数Int=>Int
的方法。到目前为止还不错。但是现在returna
会导致该方法返回a
的值,这是一个Int
。这会中断,因为我们需要Int=>Int
并返回一个ode>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
}
}
}
}
def类别:(Int=>Int)={a=>
如果(a=7&&a=14&&a)您已将返回类型定义为(Int=>Int)
而您只返回整数值。我想错误日志很清楚。我想您必须只返回整数。@RameshMaharjan类型声明很好,问题在于function@puhlen是的,我理解。OP需要返回一个函数而不是整数。顺便说一下,我已经回答了stat使用OP的逻辑定义udf函数的正确方法之一。您已将返回类型定义为(Int=>Int)
而您只返回整数值。我想错误日志很清楚。我想您必须只返回整数。@RameshMaharjan类型声明很好,问题在于function@puhlen是的,我理解。OP需要返回一个函数而不是整数。顺便说一下,我已经回答了stat使用OP的逻辑定义udf函数的正确方法之一。这并没有解决OP产生错误的问题,即试图在函数中使用return
。@puhlen,您是对的,使用return
确实是主要问题。感谢您指出。还有一个参数类型问题uld将使UDF不适用,尽管它不会导致报告的问题。这并不能解决导致op出现错误的问题,即试图在函数中使用return
。@puhlen,您是对的,使用return
确实是主要问题。感谢您指出。还有一个参数类型问题t将导致UDF不适用,尽管它不会导致报告的问题。