pyspark 数据框比较以根据关键字段查找列差异

Posted

技术标签:

【中文标题】pyspark 数据框比较以根据关键字段查找列差异【英文标题】:pyspark dataframe comparison to find columns difference based on key fields 【发布时间】:2018-03-03 23:54:20 【问题描述】:

我必须使用 pyspark 比较两个数据帧以找出基于一个或多个关键字段的列差异,这是一种性能效率最高的方法,因为我必须处理巨大的数据帧

我已经构建了一个解决方案,用于使用哈希匹配比较两个数据帧,而无需像 data_compare.df_subtract(self.df_db1_hash,self.df_db2_hash) 这样的关键字段匹配 但是如果我想使用关键字段匹配,情况就不同了

注意:我提供了示例预期数据框。实际要求是任何列中与 DataFrame 2 的任何差异都应在输出/预期数据框中检索。

DataFrame 1:

+------+---------+--------+----------+-------+--------+
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+---------+--------+----------+-------+--------+
|     3|  Chennai|  rahman|9848022330|  45000|SanRamon|
|     1|Hyderabad|     ram|9848022338|  50000|      SF|
|     2|Hyderabad|   robin|9848022339|  40000|      LA|
|     4|  sanjose|   romin|9848022331|  45123|SanRamon|
+------+---------+--------+----------+-------+--------+

DataFrame 2:

+------+---------+--------+----------+-------+--------+
|emp_id| emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+---------+--------+----------+-------+--------+
|     3|  Chennai|  rahman|9848022330|  45000|SanRamon|
|     1|Hyderabad|     ram|9848022338|  50000|      SF|
|     2|Hyderabad|   robin|9848022339|  40000|      LA|
|     4| sandiego|  romino|9848022331|  45123|SanRamon|
+------+---------+--------+----------+-------+--------+

Expected dataframe after comparing dataframe 1 and 2


+------+---------+--------+----------+
|emp_id| emp_city|emp_name| emp_phone|
+------+---------+--------+----------+
|     4| sandiego|  romino|9848022331|
+------+---------+--------+----------+

【问题讨论】:

如果 emp_id 与 1 的 emp_city 列不匹配,除了问题中的不匹配。输出数据框是什么? 感谢您强调这种情况,我已经编辑了我的帖子以提供更清晰的信息。回答您的问题,输出数据帧中甚至需要 emp_city。 你没有理解我的问题,是吗?我要问的是,如果 emp_id 1 的两个数据帧的 emp_city 也不同怎么办?预期的数据框会是什么样子? | 4| ???? | romino||9555552331| 的emp_city 是什么?? 我再次更新了我的原始帖子(预期的数据框)。在基于一个或多个关键字段比较数据帧 1 和 2 之后,我喜欢在输出数据帧中获得与数据帧 2 的差异。我希望现在回答你的问题。谢谢 如果您有任何方法可以继续此方案,请告诉我。 【参考方案1】:

subract 函数是您正在寻找的,它将检查每一行的所有列值,并为您提供一个与其他数据框不同的数据框。

df2.subtract(df1).select("emp_id","emp_city","emp_name","emp_phone")

正如 api 文档所说

返回一个新的 :class:DataFrame 包含此框架中的行,但不包含另一个框架。 这相当于 SQL 中的EXCEPT

【讨论】:

非常感谢。在我的真实场景中,它是一个动态数据处理。我必须对我不知道具有不同值的列名的表列表进行类似的检查。 如果您不知道名称,您可以离开选择部分。它将为您提供数据框 2 的所有列。我包括选择以匹配您在问题中所需的输出。那么,答案对您有帮助吗?如果是,请考虑接受和投票:) 我必须只报告不同值的列,但它当前的解决方案将检索所有列 @RameshMaharjan 有没有办法选择性地应用减法?例如只考虑某些列之间的差异? 减去 no 你不能这样做。但是您可以将它们合并,然后使用 dropDuplicates 来提供列名。它只是一个想法,虽然@timbram 还没有测试它

以上是关于pyspark 数据框比较以根据关键字段查找列差异的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark DataFrame:查找两个 DataFrame 之间的差异(值和列名)

合并列是变量结构的数据框 - Pyspark

Excel根据标题比较两列以查找同一行中的匹配或差异

Pyspark:基于所有列减去/差异 pyspark 数据帧

将pyspark数据框的列转换为小写

Pyspark:查找两个数据框的交集仅返回一列具有值