2017-06-03 5 views
1

私はデータの下に含まれているデータフレームDF1、を有する:私はデータの下に含まれている別のデータフレームDF2有するDataFramesを結合して不足行だけを追加するにはどうすればいいですか?

**customer_id** **product** **Val_id** **rule_name** 
    1    A   1    rule1 
    2    B   X    rule1 

た:両方のデータフレームに

**customer_id** **product** **Val_id** **rule_name** 
    1    A   1    rule2 
    2    B   X    rule2 
    3    C   y    rule2 

RULE_NAME値が常に一定

あります私は新しい組合わされたデータフレームdf3が欲しいです。データフレームdf1のすべての顧客と、df1に存在しないデータフレームdf2のすべての顧客を持つ必要があります。だから最終的なdf3は次のようになります:

誰でもこの結果を達成するために私を助けてください。どんな助けもありがとう。

答えて

1

を考えると、次のデータセット:

val df1 = Seq(
    (1, "A", "1", "rule1"), 
    (2, "B", "X", "rule1") 
).toDF("customer_id", "product", "Val_id", "rule_name") 

val df2 = Seq(
    (1, "A", "1", "rule2"), 
    (2, "B", "X", "rule2"), 
    (3, "C", "y", "rule2") 
).toDF("customer_id", "product", "Val_id", "rule_name") 

そして要件:

それはDF1に存在しないデータフレームDF2からのデータフレームDF1とすべての他の顧客からのすべての顧客を持っている必要があります。

次のように私の最初のソリューションは、次のようになります。次のように

val missingCustomers = df2. 
    join(df1, Seq("customer_id"), "leftanti"). 
    select($"customer_id", df2("product"), df2("Val_id"), df2("rule_name")) 
val all = df1.union(missingCustomers) 
scala> all.show 
+-----------+-------+------+---------+ 
|customer_id|product|Val_id|rule_name| 
+-----------+-------+------+---------+ 
|   1|  A|  1| rule1| 
|   2|  B|  X| rule1| 
|   3|  C|  y| rule2| 
+-----------+-------+------+---------+ 

別の(そしておそらく遅い)ソリューションは次のようになります。

// find missing ids, i.e. ids in df2 that are not in df1 
// BE EXTRA CAREFUL: "Downloading" all missing ids to the driver 
val missingIds = df2. 
    select("customer_id"). 
    except(df1.select("customer_id")). 
    as[Int]. 
    collect 

// filter ids in df2 that match missing ids 
val missingRows = df2.filter($"customer_id" isin (missingIds: _*)) 

scala> df1.union(missingRows).show 
+-----------+-------+------+---------+ 
|customer_id|product|Val_id|rule_name| 
+-----------+-------+------+---------+ 
|   1|  A|  1| rule1| 
|   2|  B|  X| rule1| 
|   3|  C|  y| rule2| 
+-----------+-------+------+---------+ 
+1

これは、ここで行うことはありません。データに間違いがなければ参加する必要があります。 – zero323

関連する問題