2015-06-11 15 views
15

Próbuję dodać kolumnę "CASE WHEN ... ELSE ..." do istniejącej DataFrame, używanie interfejsów API Scala. Zaczynając dataframe:Apache Spark, dodaj kolumnę "CASE WHEN ... ELSE ..." do istniejącej DataFrame

color 
Red 
Green 
Blue 

Pożądany dataframe (składnia SQL: przypadek, gdy kolor == Zielona THEN 1 ELSE 0 END AS Bool):

color bool 
Red 0 
Green 1 
Blue 0 

Jak należy wdrożyć tę logikę?

+1

Możliwy duplikat [SPARK SQL - przypadek, gdy następnie] (https://stackoverflow.com/questions/25157451/spark-sql-case-when-then) –

Odpowiedz

41

W nadchodzącym wydaniu SPARK 1.4.0 (powinien zostać wydany w ciągu kilku najbliższych dni). Można użyć kiedy/inaczej składnię:

// 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)) 

Jeśli używasz SPARK 1.3.0 można wybrał, aby użyć UDF:

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

Dziękuję bardzo Hermana, to działa! –

6

W Spark 1.5.0: można również użyć funkcja wyrażenie składni SQL

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

lub zwykły zapłonem SQL

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

Działa to również w języku Python –

1

Znalazłem to:

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

pracował dla mnie na iskry 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

szukałem tego długo więc tutaj jest przykładem SPARK 2.1 JAVA z grupy kroku dla innych użytkowników 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") 
      ); 
Powiązane problemy