繁体   English   中英

Spark Int和Integer,udf

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

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