2017-05-08 3 views
0

私はそれがどのように見えるdfを呼ばDATAFRAMEお持ちの場合:DataFrame.withColumnでは、2番目のパラメータの条件として列の値が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) 

時々私は静的な値の代わりに、別の列の値を使用する必要があるので、私はまた、私の知る限りでは、COALESCEを使用することはできません。

もう一度編集:テスト項目をnullable = falseに設定しても効果がありません。

答えて

3

nullは値を意味しないため、このようにチェックしないでください。

isNull機能の使用:

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

または​​3210、最初の非NULL値を返します。

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

おかげで - 私はのisNullを試み、動作するようには思えませんでした。その問題がある場合に備えて、テストデータフレームをどのように構築するかについていくつかの詳細を追加しました。他の列の値ではなく静的な値を使用する必要がある場合があるため、合体を使用することもできないと考えています。 – yoel

+0

@yoelスキーマがnullable = falseであるため)nullで動作しない –

+0

もちろん - ありがとう! – yoel

関連する問題