2017-05-08 25 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

相关问题