2015-06-11 3 views
15

Я пытаюсь добавить вычисляемый столбец «CASE WHEN ... ELSE ...» к существующему DataFrame, используя API Scala. Начиная dataframe:Apache Spark, добавьте столбец «CASE WHEN ... ELSE ...» в существующий DataFrame

color 
Red 
Green 
Blue 

Желаемая dataframe (синтаксис SQL: случай, когда цвет == Зеленый THEN 1 ELSE 0 END AS BOOL):

color bool 
Red 0 
Green 1 
Blue 0 

Как я должен реализовать эту логику?

+1

Возможного дубликат [СПАРК SQL - случай, когда то] (https://stackoverflow.com/questions/25157451/spark-sql-case-when-then) –

ответ

41

В предстоящем выпуске SPARK 1.4.0 (должен быть выпущен в ближайшие пару дней). Вы можете использовать когда/в противном случае синтаксис:

// Create the dataframe 
val df = Seq("Red", "Green", "Blue").map(Tuple1.apply).toDF("color") 

// Use when/otherwise syntax 
val df1 = df.withColumn("Green_Ind", when($"color" === "Green", 1).otherwise(0)) 

Если вы используете SPARK 1.3.0 вы можете выбрать, чтобы использовать UDF:

// Define the UDF 
val isGreen = udf((color: String) => { 
    if (color == "Green") 1 
    else 0 
}) 
val df2 = df.withColumn("Green_Ind", isGreen($"color")) 
+0

Большого спасибо Германа, это работает! –

6

В Спарк 1.5.0 вы также можете использовать функция выража SQL синтаксиса

val df3 = df.withColumn("Green_Ind", expr("case when color = 'green' then 1 else 0 end")) 

или простой искровой SQL

df.registerTempTable("data") 
val df4 = sql(""" select *, case when color = 'green' then 1 else 0 end as Green_ind from data """) 
+1

Это тоже работает на Python –

1

Я нашел это:

https://issues.apache.org/jira/browse/SPARK-3813

Работал для меня на искру 2.1.0:

import sqlContext._ 
val rdd = sc.parallelize((1 to 100).map(i => Record(i, s"val_$i"))) 
rdd.registerTempTable("records") 
println("Result of SELECT *:") 
sql("SELECT case key when '93' then 'ravi' else key end FROM records").collect() 
0

Я искал, что долго так вот пример SPARK 2.1 JAVA с группой каждого конкретного для других пользователей java.

import static org.apache.spark.sql.functions.*; 
//... 
    Column uniqTrue = col("uniq").equalTo(true); 
    Column uniqFalse = col("uniq").equalTo(false); 

    Column testModeFalse = col("testMode").equalTo(false); 
    Column testModeTrue = col("testMode").equalTo(true); 

    Dataset<Row> x = basicEventDataset 
      .groupBy(col(group_field)) 
      .agg(
        sum(when((testModeTrue).and(uniqTrue), 1).otherwise(0)).as("tt"), 
        sum(when((testModeFalse).and(uniqTrue), 1).otherwise(0)).as("ft"), 
        sum(when((testModeTrue).and(uniqFalse), 1).otherwise(0)).as("tf"), 
        sum(when((testModeFalse).and(uniqFalse), 1).otherwise(0)).as("ff") 
      ); 
Смежные вопросы