Scala Spark Int和Integer,udf

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)

我刚开始学火花。我试图为我的数据帧定义一个自定义项。这是一个非常简单的函数,如下所示: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){
            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不适用,尽管它不会导致报告的问题。