如何在Spark UDF中编写多个If语句

时间:2017-09-28 08:11:56

标签: apache-spark apache-spark-sql

我的要求是为age创建类别。我正在尝试在UDF中编写多个if条件但是它正在使用其他条件。我的代码如下。

我的数据

1,Ashok,23,asd
2,Joi,27,dfs
3,Sam,30,dft
4,Bob,37,dat

我的代码

val sqlContext = new org.apache.spark.sql.SQLContext(sc)
import org.apache.spark.sql.functions._
import org.apache.spark.sql.types._
import org.apache.spark.sql._
import org.apache.spark.sql.SaveMode
import sqlContext.implicits._
val a = sc.textFile("file2.txt")
a.foreach(println)

val coder: (Int=>String)=(arg:Int)=>{if(arg>20&&arg<27) "20-27";if(arg>30&&arg<37) "30-37"; else "38+"}

val co = udf(coder)

val a2 = a1.select(col("Id"),col("Name"),col("Age"),col("Dpt"))

a2.withColumn("range",co(col("Age"))).show()

输出我正在

1,Ashok,23,asd,38+
2,Joi,27,dfs,38+
3,Sam,30,dft,38+
4,Bob,37,dat,38+

对于每行显示38+,请建议语法。

1 个答案:

答案 0 :(得分:8)

您应该使用if - else if - else

此外,当您检查arg>27 && arg<30

时,您正在跳过边界值

你的UDF应该是这样的:

val co = udf { (x: Int) => 
    if (x >= 20 && x <=27) "20-27"
    else if (x > 27 && x<=37 ) "28-37"
    else "38+" 
}

// co: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,StringType,List(IntegerType))

df.withColumn("range" , co($"age" ) ).show

// +---+-----+---+---+-----+
// | id| name|age|dpt|range|
// +---+-----+---+---+-----+
// |  1|Ashok| 23|asd|20-27|
// |  2|  Joi| 27|dfs|28-37|
// |  3|  Sam| 30|dft|28-37|
// |  4|  Bob| 37|dat|  38+|
// +---+-----+---+---+-----+