2017-05-05 61 views
1

如果我有一個名爲DF是數據框的樣子:在DataFrame.withColumn中,如何使用列的值作爲第二個參數的條件?

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

我會期望從:

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

是DF2會是什麼樣子:

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

而是我得到:

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

所以這聽起來像我需要一個Column的方法,它在DataFrame的withColumn方法中產生它的值。

任何這樣的事情,或其他方法來有條件地用當前列的值填充withColumn的替換參數?

回答

4

你需要===而不是==

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

您需要使用=====

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

3秒...... @psidom打敗你吧:o –

+2

@TzachZohar剛表明我應該始終運行我的Spark REPL,啓動時間可能會造成所有差異! –

+0

真棒感謝你們兩個 - 獎金問題,然後,如何來=== null似乎不工作? – yoel

相關問題