2016-11-21 15 views
1

私は、左アウトジョインを使用して2つのデータフレームから重複エレメントを削除するソリューションを実装しています。結合条件を実行した後、私は右の表のNULL列をチェックする必要があります。整数型カラムのNULLチェックを結合した後のスパークデータフレーム

val llist = Seq(("bob", "2015-01-13", 4), ("alice", "2015-04-23",10)) 
val left = llist.toDF("name","date","duration") 
val right = Seq(("alice", "2015-04-23",10),("bob", "2015-04-23", 23)).toDF("name","date","duration") 


val df = left.join(right , left("name") === right("name") && 
    left("date") === right("date") && 
    left("duration").cast(StringType) === right("duration").cast(StringType) 
    ,"left_outer").filter(right("duration").isNull) 

しかし、null値の整数列をフィルタリングできません。結合後に整数のヌルチェックを行うにはどうすればよいですか?

+0

なぜ、 'duration'(これはInt)をStringにキャストしますか? –

+0

質問に入力データフレームと予想される出力データフレームを追加できますか? – mrsrinivas

答えて

1

達成したいことはむしろ不明です。あなたのやり方はあいまいな列名を作ります。また、結合したデータフレームではなく、元の(ソース)データフレーム(right)をフィルタ条件で参照します。

あなたがそれらに参加したい場合は、あなたが行うことができます:

val df = left 
     .join(right , Seq("name","date","duration"),"left_outer") 

しかし、重複した列が削除されているので、いずれかの「ヌル」の列にはなりません。

+-----+----------+--------+ 
| name|  date|duration| 
+-----+----------+--------+ 
| bob|2015-01-13|  4| 
|alice|2015-04-23|  10| 
+-----+----------+--------+ 

そうでない場合、あなたはこの試みることができる:

val df = left.as('left) 
    .join(right.as('right) , 
      $"left.name" === $"right.name" 
     and $"left.date" === $"right.date" 
     and $"left.duration" === $"right.duration" 
    ,"left_outer" 
) 
    .filter($"right.duration".isNull) 

をこれは

+----+----------+--------+----+----+--------+ 
|name|  date|duration|name|date|duration| 
+----+----------+--------+----+----+--------+ 
| bob|2015-01-13|  4|null|null| null| 
+----+----------+--------+----+----+--------+ 

EDITになります:

あなただけの重複を削除したい場合は、これをすることができ:

val df = left.unionAll(right).distinct() 
+0

ありがとう、それは働いた。実際には、私は左外部結合を行い、右のDFでヌルデータをチェックすることによって、両方のデータフレームで共通の行を削除しようとしています。 – Vinod

+0

@Vinodデータフレームの "例外"メソッドを調べてください。 –

+0

@VinodまたはunionAllを使用して別のものを使用してください。 –

関連する問題