2017-05-05 2 views
1

Wenn ich ein Dataframe df so genannt wie folgt aussieht:Wie kann ich in DataFrame.withColumn den Wert der Spalte als Bedingung für den zweiten Parameter verwenden?

+---+---+ 
| a1+ a2| 
+---+---+ 
|foo|bar| 
|N/A|baz| 
+---+---+ 

ich erwarten würde:

val df2 = df.withColumn("a1", when($"a1" == "N/A", $"a2)) 

, die aussehen würde dF2:

+---+---+ 
| a1+ a2| 
+---+---+ 
|foo|bar| 
|baz|baz| 
+---+---+ 

sondern erhalte ich:

error: type mismatch; 
found : Boolean 
required: org.apache.spark.sql.Column 

So klingt es wie ich brauche eine Methode von Column, die ihren Wert innerhalb einer DataFrame withColumn-Methode erzeugt.

Eine solche Sache oder ein anderer Ansatz, um den Ersetzungsparameter von withColumn durch den Wert der aktuellen Spalte bedingt aufzufüllen?

Antwort

4

Sie benötigen === statt ==:

val df2 = df.withColumn("a1", when($"a1" === "N/A", $"a2").otherwise($"a1")) 
// df2: org.apache.spark.sql.DataFrame = [a1: string, a2: string] 

df2.show 
+---+---+ 
| a1| a2| 
+---+---+ 
|foo|bar| 
|baz|baz| 
+---+---+ 
1

Sie müssen verwenden === nicht ==:

scala> val df = Seq(("foo", "bar"), ("N/A", "baz")).toDF("a1", "a2") 
df: org.apache.spark.sql.DataFrame = [a1: string, a2: string] 

scala> df.show 
+---+---+ 
| a1| a2| 
+---+---+ 
|foo|bar| 
|N/A|baz| 
+---+---+ 

scala> df.withColumn("a1", when($"a1" === "N/A", $"a2").otherwise($"a1")).show 
+---+---+ 
| a1| a2| 
+---+---+ 
|foo|bar| 
|baz|baz| 
+---+---+ 
+3

@psidom Sie es um 3 Sekunden zu schlagen ...: O –

+2

@TzachZohar nur zeigt, dass ich immer meine Spark REPL laufen lassen sollte, dass die Startzeit den Unterschied gemacht haben könnte! –

+0

Awesome Dank an euch beide - Bonus Frage dann, wie kommt === null scheint nicht zu funktionieren? – yoel

Verwandte Themen