2016-11-08 2 views
-1

Я не понимаю, что здесь происходит не так.Spark Dataframe UDF: И (&&) оператор не работает внутри if-else

ОШИБКА У меня есть А (& &) оператор не работает, все направляется на другое. Если я не использую оператор And (&), то работает некоторое условие if. Пожалуйста, посмотрите на колонку возраст и ageGroup ниже, сравните их с декларацией UDF. Как возраст 6 и 7 лет являются взрослыми, а 20 - ребенком?

Выход
enter image description here

Вот мой код:

Все импортные свечи и инициализацию

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 Код ниже

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

Вызов UDF

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

Это где я принял помощь от: Apache Spark, add an "CASE WHEN ... ELSE ..." calculated column to an existing DataFrame

ответ

0

Проблема в том, что первое условие ваш UDF не действует, потому что функция n ot возвращается в этот момент, но продолжает следующий if-statement.

Вы можете переписать его, как это с помощью 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 является взрослой?)

+0

его только для тестирования. глупый, я понял, вчера, но не смог удалить вопрос. Я забыл, если-еще заявления, да!. Мне нужно удалить этот вопрос, какое-нибудь предложение? – Adnan

+0

@Adnan или просто принять мой anwser ... –

Смежные вопросы