UDF spark scala基于输入范围计算结果
我写道:UDF spark scala基于输入范围计算结果,scala,apache-spark,Scala,Apache Spark,我写道: val kind: UserDefinedFunction = udf((col1: Int, col2: Float, col3: Float) => { if (col1 < 11) { BREAKFAST } else if (col1 >= 11 && col1 <= 14 && (col2 > 2 || col3 > 0)) { LUNCH } el
val kind: UserDefinedFunction = udf((col1: Int, col2: Float, col3: Float) => {
if (col1 < 11) {
BREAKFAST
} else if (col1 >= 11 && col1 <= 14 && (col2 > 2 || col3 > 0)) {
LUNCH
}
else if (col1 > 14 && col1 < 18) {
SNACK
}
else if (col1 >= 18) {
DINNER
}
else {
OTHER
}
你知道怎么解决这个问题吗
谢谢这是因为您的数据有空值 您需要将参数类型从
Int
更改为Integer
让我们看看例子
scala>df.printSchema
根
|--年龄:整数(可空=真)
|--高度:整数(nullable=true)
scala>df.show
+---+------+
|年龄|身高|
+---+------+
| 10| 10|
|10 |零|
|15 |零|
+---+------+
val-kind=udf((col1:Int,col2:Int)=>{
if(col1<11){
“案例1”
}else if(col1>=11&&col1 2){
“案例2”
}
否则如果(col1>14&&col1<18){
“案例3”
}
else if(col1>=18){
“案例4”
}
否则{
“案例5”
}
}
)
我有3行,udf看起来像你的
当我调用udf时,我得到空结果
scala>df.withColumn(“输出”、种类(df(“年龄”)、df(“高度”)).show
+---+------+------+
|年龄|身高|输出|
+---+------+------+
|10 | 10 |案例1|
|10 |零|零|
|15 |零|零|
+---+------+------+
但是,如果我这样修改udf:
val-kind=udf((col1:Integer,col2:Integer)=>{
if(col1<11){
“案例1”
}else if(col1>=11&&col1 2){
“案例2”
}
否则如果(col1>14&&col1<18){
“案例3”
}
else if(col1>=18){
“案例4”
}
否则{
“案例5”
}
}
)
输出没有空值,因为Int
type不能有null
,但Integer
可以
scala>df.withColumn(“输出”、种类(df(“年龄”)、df(“高度”)).show
+---+------+------+
|年龄|身高|输出|
+---+------+------+
|10 | 10 |案例1|
|10 |空|情况1|
|15 |空|情况3|
+---+------+------+
MEAL|INT_HOUR|
+------------+--------+
| null| 15|
| null| 15|
| null| 15|
| null| 18|
| null| 17|
| null| 14|
| null| 11|
| null| null|
| null| null|
| null| null|
| null| null|
| null| null|
| LUNCH| 13|
| null| 11|
| null| 14|
| null| 15|
| null| 15|
| null| 14|
| null| null|
| null| 11