web-dev-qa-db-de.com

Apache Spark, fügen Sie eine berechnete Spalte "CASE WHEN ... ELSE ..." einem vorhandenen DataFrame hinzu

Ich versuche, eine mit "CASE WHEN ... ELSE ..." berechnete Spalte einem vorhandenen DataFrame hinzuzufügen, und zwar mit Scala-APIs . Starten des Datenrahmens:

color
Red
Green
Blue

Gewünschter Datenrahmen (SQL-Syntax: CASE WHEN color == Green THEN 1 ELSE 0 END AS bool):

color bool
Red   0
Green 1
Blue  0

Wie soll ich diese Logik implementieren?

20

In der kommenden Version SPARK 1.4.0 (sollte in den nächsten Tagen veröffentlicht werden). Sie können die Wann/Andernfalls-Syntax verwenden:

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

Wenn Sie SPARK 1.3.0 verwenden, können Sie eine UDF verwenden:

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

In Spark 1.5.0: Sie können auch die SQL-Syntax-Funktion expr verwenden

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

oder einfach funken-sql

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

Ich habe das gefunden:

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

Arbeitete für mich an spark 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()
1
ozma

Ich habe so lange gesucht, hier ist ein Beispiel für SPARK 2.1 Java mit Group by- für andere Java-Benutzer.

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")
            );
0
Ehud Lev