2017-05-08 29 views
0

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

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

我可以選擇像這樣替換值:

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

使DF2看起來像:

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

但爲什麼我不能檢查它是否爲空,如:

val df3 = df2.withColumn("a1", when($"a1" === null, $"a2")) 

讓我得到:

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

編輯:$ 「A1」 .isNull似乎並沒有工作。難道是因爲我正在構建我用來測試的數據框,如下所示?

val schema = StructType(
       StructField("a1", StringType, false) :: 
       StructField("a2", StringType, false) :: Nil 
) 

val data = sc.parallelize(Array(
       Row("foo","bar"), 
       Row("N/A","baz"), 
       Row(null,"etc")) 
) 

val df = sqlContext.createDataFrame(data, schema) 

我也不能使用聚結,據我所知,因爲有時我需要使用一個靜態值,而不是另一列的值。

再次編輯:將我的測試列設置爲nullable = false並沒有幫助。

回答

3

因爲null意味着沒有值,不應該像這樣檢查。

使用isNull功能:

val df3 = df2.withColumn("a1", when($"a1".isNull, $"a2")) 

或​​3210,返回第一個非空值:

val df3 = df2.withColumn("a1", coalesce($"a1", $"a2")) 
+0

謝謝 - 我想的isNull,它似乎並沒有工作。我添加了一些關於如何構建測試數據框的細節,以防發生問題。我也不認爲我可以使用coalesce,因爲有時我需要使用靜態值而不是另一列的值 – yoel

+0

@yoel它因爲你的模式有nullable = false;)它不能使用null –

+0

當然哇- 謝謝!!! – yoel

相關問題