如何在行级别上比较两个海量 Spark 数据帧并打印差异

Posted

技术标签:

【中文标题】如何在行级别上比较两个海量 Spark 数据帧并打印差异【英文标题】:How to compare two massive spark dataframes on row level and print the difference 【发布时间】:2019-03-21 03:58:31 【问题描述】:

我有两个非常大的 spark 数据框。我想在行级别上比较它并只打印差异

例如:

df1= firstname:abc lastname:xyz company:123


df2= firstname:abc lastname:xyz company:456


预期输出-diff= company(df1):123 company(df2):456

【问题讨论】:

预期输出是多少?请向我们展示您的尝试 预期输出应该只显示行差异。我试过这个:capitalone.github.io/datacompy/api/sparkcompare.html 但输出不符合预期 【参考方案1】:

就我而言,您所描述的问题没有最佳解决方案。因为,只有当您有一个column/reference 可以连接两个数据框时,才能发现数据框之间的差异。

有了这个注释,一种方法是使用subtract 函数找到差异,这在一定程度上有所帮助。

>>> df_1.show()
+-----+-----+-----+
|fname|lname|cmpny|
+-----+-----+-----+
|  abc|  xyz|  123|
+-----+-----+-----+

>>> df_2.show()
+-----+-----+-----+
|fname|lname|cmpny|
+-----+-----+-----+
|  abc|  xyz|  456|
+-----+-----+-----+

>>> df_1.select('*').subtract(df_2.select('*')).show()
+-----+-----+-----+
|fname|lname|cmpny|
+-----+-----+-----+
|  abc|  xyz|  123|
+-----+-----+-----+

>>> df_2.select('*').subtract(df_1.select('*')).show()
+-----+-----+-----+
|fname|lname|cmpny|
+-----+-----+-----+
|  abc|  xyz|  456|
+-----+-----+-----+

【讨论】:

【参考方案2】:

我想你在找except

df1.except(df2)

将返回 df1 中的行而不是 df2 中的行。

【讨论】:

以上是关于如何在行级别上比较两个海量 Spark 数据帧并打印差异的主要内容,如果未能解决你的问题,请参考以下文章

Spark大数据处理TB级别海量数据的Shuffle成本(草稿)

spark中将每个组作为新数据帧并在循环中传递另一个函数的最佳方法是啥?

比较两个数据帧并根据第一个df返回差异[重复]

如何通过比较火花中相同列的两个数据帧来计算列值的数量

如何加快 Spark 中的大数据框连接

如何在 Scala 中连接两个数据帧并通过索引从数据帧中选择几列?