Spark Dataframe UDF:And(&&) 运算符在 if-else 内部不起作用

Spark Dataframe UDF: And(&&) operator not working inside if-else

我不明白这里出了什么问题。

我遇到的 ERROR 是 And(&&) 运算符不工作,所有内容都指向其他。如果我不只使用 And(&&) 运算符,则某些 if 条件会起作用。请查看下面的ageageGroup 列,将它们与UDF 声明进行比较。 6岁和7岁是成年人,20岁是孩子?

Output

这是我的代码:

All Spark imports and initializations

import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.sql.types._
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import org.apache.spark.sql.functions.udf

case class Person(name: String, address:String, state, age:Int, phone:Int, order:String)

val df = Seq(
("adnan", "migi way", "texas", 10, 333, "AX-1"),
("dim", "gigi way", "utah", 6,222, "AX-2"),
("alvee", "sigi way", "utah", 9,222, "AX-2"),
("john", "higi way", "georgia", 20,111, "AX- 3")).toDF("name","address","state","age","phone", "order")


val df1 = datafile.map(_.split("\|")).map(attr => Person(attr(0).toString, attr(1).toString, attr(2).toString, attr(3).toInt, attr(4).toInt, attr(5).toString)).toDF()

UDF Code below

def ageFilter = udf((age: Int) => {
  if (age >= 2 && age <= 9) "bacha"
   if (age >= 10 ) "kiddo"
    else "adult"
  })

Calling the UDF

val one_hh_ages = df1.withColumn("ageGroup", ageFilter($"age"))

这是我得到帮助的地方:

问题在于您的 UDF 中的第一个条件无效,因为函数此时未返回,而是继续执行下一个 if 语句。

您可以使用 else if

重写它
def ageFilter = udf((age: Int) => {
  if (age >= 2 && age <= 9) "bacha"
  else if (age >= 10 ) "kiddo"
  else "adult"
})

或者这个模式匹配:

def ageFilter = udf((age: Int) => {
  age match {
    case age if age >=2 && age <=9  => "bacha"
    case age if age >=10            => "kiddo"
    case default                    => "adult"
  }
})

但是你真的应该检查一下你的逻辑条件(10岁以上是小孩?2岁以下是成人?)