2017-02-20 2 views
0

Учитывая ниже структуру:Apche искры случай с несколькими, когда положения на разных колонках

val df = Seq("Color", "Shape", "Range","Size").map(Tuple1.apply).toDF("color") 

val df1 = df.withColumn("Success", when($"color"<=> "white", "Diamond").otherwise(0)) 

я хочу написать еще одно, когда выполнено условие при температуре выше, где размер> 10 и форма колонки значение ромба затем «Алмаз» значение должно быть вставлено в столбец еще 0. Я попытался, как показано ниже, но это не суметь

val df1 = df.withColumn("Success", when($"color" <=> "white", "Diamond").otherwise(0)).when($"size">10) 

Пожалуйста, предложите мне единственный вариант dataframe с Скале. Spark-SQL с sqlContext не полезен для меня.

Спасибо!

ответ

0

Вы пытались создать UDF? Попробуйте что-то вроде этого:

// Define the UDF 
val isDiamond= udf((color: String, shape: String, size : String) => { 
    if (color == "white" && shape == "Rhombus" && size > 10) "Diamond" 
    else "" 
}) 
val df2 = df.withColumn("Success", isDiamond($"color", $"shape", $"size")) 

С уважением.

0

Вы можете приковать when аналогично примеру в https://spark.apache.org/docs/2.2.0/api/java/org/apache/spark/sql/Column.html#when-org.apache.spark.sql.Column-java.lang.Object- доступны с (1.4.0)

// Scala: 
people.select(when(people("gender") === "male", 0) 
.when(people("gender") === "female", 1) 
.otherwise(2)) 

Ваш пример:

val df1 = df.withColumn("Success", 
    when($"color" <=> "white", "Diamond") 
    .when($"size" > 10 && $"shape" === "Rhombus", "Diamond") 
    .otherwise(0)) 
Смежные вопросы