объединение двух информационных фреймов с дублирующейся строкой - PullRequest
0 голосов
/ 11 мая 2018

У меня есть два следующих кадра данных

df1

+--------+-----------------------------
|id  | amount       | fee             | 
|1   | 10.00        | 5.0             |
|3   | 90           | 130.0           |

df2

+--------+--------------------------------
|exId  | exAmount     | exFee            | 
|1     | 10.00        | 5.0              |
|1     | 10.0         | 5.0              |
|3     | 90.0         | 130.0              |

Я объединяю их, используя все три столбца, и пытаюсь определить столбцы, которые являются общими для двух кадров данных, и те, которые не являются.

Я ищу вывод:

+--------+--------------------------------------------
|id  | amount       | fee  |exId  | exAmount | exFee | 
|1   | 10.00        | 5.0  |1     | 10.0     | 5.0   |
|null| null         | null |1     | 10.0     | 5.0   |
|3   | 90           | 130.0|3     | 90.0     | 130.0 |

Как правило, необходимо, чтобы дублирующаяся строка в df2 с exId 1 была указана отдельно. Есть мысли?

1 Ответ

0 голосов
/ 11 мая 2018

Один из возможных способов - сгруппировать по всем трем столбцам и сгенерировать номера строк для каждого кадра данных. и использовать этот дополнительный столбец в дополнение к остальным трем столбцам, в то время как присоединение . Вы должны получить то, что вы хотите.

import org.apache.spark.sql.expressions._
def windowSpec1 = Window.partitionBy("id", "amount", "fee").orderBy("fee")
def windowSpec2 = Window.partitionBy("exId", "exAmount", "exFee").orderBy("exFee")

import org.apache.spark.sql.functions._
df1.withColumn("sno", row_number().over(windowSpec1)).join(
  df2.withColumn("exSno", row_number().over(windowSpec2)),
  col("id") === col("exId") && col("amount") === col("exAmount") && col("fee") === col("exFee") && col("sno") === col("exSno"), "outer")
  .drop("sno", "exSno")
  .show(false)

и вы должны получить

+----+------+-----+----+--------+-----+
|id  |amount|fee  |exId|exAmount|exFee|
+----+------+-----+----+--------+-----+
|null|null  |null |1   |10.0    |5.0  |
|3   |90    |130.0|3   |90      |130.0|
|1   |10.00 |5.0  |1   |10.00   |5.0  |
+----+------+-----+----+--------+-----+

Надеюсь, ответ полезен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...