【问题标题】:joining two dataframes having duplicate row连接两个具有重复行的数据框
【发布时间】:2018-05-11 10:59:02
【问题描述】:

我有以下两个数据框

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 的重复行单独列出。 有什么想法吗?

【问题讨论】:

  • 输出不应改变。基本上,一次出现的行应该与第二个数据帧中出现的同一行匹配。如果其中任何一个有额外的行(重复),它不应该匹配。
  • @RameshMaharjan 不必担心 10.0 与 10.00。如果这能让事情变得干净,可以将其保持为整数。
  • 不,他们不应该。

标签: scala apache-spark apache-spark-sql


【解决方案1】:

一种可能的方法按所有三列分组并为每个数据帧生成行号在其余三列之外使用该附加列加入时的列。你应该得到你想要的。

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  |
+----+------+-----+----+--------+-----+

希望回答对你有帮助

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 2019-10-29
  • 2017-12-30
  • 1970-01-01
相关资源
最近更新 更多