2016-09-09 14 views
3

DataFrameを条件付きで結合しようとしています。Spark DataFrameの条件付き結合

は、私は2つのデータフレームAを有し、そしてB.は

AはBがm_cd、c_cd及びレコード列が含ま ID、m_cdとc_cd列が含ま

条件である -

  • m_cdがnullの場合Aのc_cdをBと結合する
  • m_cdがヌルでない場合、Aのm_cdとBを結合する

データフレームのwithcolumn()メソッドで "when"と "otherwise()"を使用できるので、データフレームの結合の場合にこれを行う方法はあります。

私はすでにUnionを使用してこれを行っていますが、その他のオプションがあるかどうかを知りたいと思っていました。

答えて

4

ジョイン条件に「とき」/「そう」を使用することができます:まだかかわらず、組合を使用する方が読みやすいかもしれません

case class Foo(m_cd: Option[Int], c_cd: Option[Int]) 
val dfA = spark.createDataset(Array(
    Foo(Some(1), Some(2)), 
    Foo(Some(2), Some(3)), 
    Foo(None: Option[Int], Some(4)) 
)) 


val dfB = spark.createDataset(Array(
    Foo(Some(1), Some(5)), 
    Foo(Some(2), Some(6)), 
    Foo(Some(10), Some(4)) 
)) 

val joinCondition = when($"a.m_cd".isNull, $"a.c_cd"===$"b.c_cd") 
    .otherwise($"a.m_cd"===$"b.m_cd") 

dfA.as('a).join(dfB.as('b), joinCondition).show 

+0

上記のコードが正常に動作しています。 – Avijit

+0

この条件で、ifとelse if、elseとjavaとscalaのような複数の条件を追加したい場合(val joinCondition = when($ "a.m_cd" .isNull、$ "a ($ "a.m_cd" === $ "b.m_cd")) それは可能ですか? – Avijit

+1

こんにちは@Avijit。複数の「時」をチェーンすることができます。 "when"と "else if"のように動作することができますので、 "when(condition1、value1).when(cond2、val2).otherwise(default)"を実行できます。 – alghimo