这里有两个数据帧:
预期数据帧:
+------+---------+--------+----------+-------+--------+
|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|
+------+---------+--------+----------+-------+--------+
以及实际数据帧:
+------+---------+--------+----------+-------+--------+
|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| romino|9848022331| 45123|SanRamon|
+------+---------+--------+----------+-------+--------+
现在两个数据帧之间的区别是:
+------+--------+--------+----------+-------+--------+
|emp_id|emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+--------+--------+----------+-------+--------+
| 4| sanjose| romino|9848022331| 45123|SanRamon|
+------+--------+--------+----------+-------+--------+
我们使用的是except函数df1.except(df2),但问题是,它返回的是不同的整行。我们希望看到该行中哪些列不同(在本例中,“romin”和“romino”与“emp_name”不同)。我们在这方面遇到了巨大的困难,任何帮助都会很好。
Spark-extensions有一个针对这种差异的API。我相信你可以这样使用它:
left.diff(right).show()
或者提供emp_id作为 id 列,如下所示:
left.diff(right, "emp_id").show()
此 API 适用于 Spark 2.4.x - 3.x。
list_col=[]
cols=df1.columns
# Prepare list of dataframes/per column
for col in cols:
list_col.append(df1.select(col).subtract(df2.select(col)))
# Render/persist
for l in list_col :
if l.count() > 0 :
l.show()
从上述问题中描述的场景来看,似乎必须在列之间而不是行之间找到差异。
因此,要做到这一点,我们需要在这里应用选择性差异,这将为我们提供具有不同值的列以及值。
现在,要应用选择性差异,我们必须编写如下代码:
>
首先,我们需要在预期和实际数据框中找到列。
val列=df1.schema.fields.map(_.name)
然后我们必须逐列找出差异。
val selectiveDifferences=列。地图(列=
最后,我们需要找出哪些列包含不同的值。
selectiveDifferences.map(diff =
而且,我们将只获得包含不同值的列。像这样:
+--------+
|emp_name|
+--------+
| romino|
+--------+
我希望这有帮助!
有人能帮忙吗?选择2不起作用。当用户输入员工姓名时,它应该显示员工ID,但当用户输入姓名时,不会打印任何内容。代码没有错误。 //搜索员工数据公共静态无效搜索(string[]emplNames,int[]emplid){
我有两个数据帧DF1和DF2。 DF1: DF2: 我需要来自DF2的行数,其中EmploymentType='Employee',EmpStatus='Active',EmpStartDate 输出: 如何在不合并两个数据帧的情况下实现这一点? 我不能合并数据帧,因为没有公共键,而且因为我需要基于条件的行数,我不能在任何临时列上加入数据帧,因为我需要避免交叉连接。
我有以下spark数据帧。一个来自文本文件,另一个来自Databricks中的Spark表: 尽管数据完全相同,但以下代码报告了差异。我希望df3为空: 我需要在比较之前订购数据吗?-如果是,我该怎么做 我看不出上面的连接是在哪里完成的。它将如何匹配行?[ID]和[帐户]是主键 以上是比较2个数据帧的最佳方法吗 这是数据-其中[ID]和[帐户]是主键
我有两个不同大小的数据帧,我想对四个不同列中的所有值进行比较(两组) 基本上,我希望看到df1['A']==df2['A'] 我的实际数据帧要大得多(120000行数据,A列的值从1到700,B列的值从1到300),所以我知道这可能是一个更长的过程。
问题内容: 我必须比较两个对象(不是)。比较它们的规范方法是什么? 我可以想到: 该运营商只比较基准,因此这将仅适用于较低的整数值的工作。但是也许自动装箱开始了…? 这看起来像一个昂贵的操作。是否以此方式计算出哈希码? 有点冗长… 编辑: 谢谢您的答复。尽管我现在知道该怎么办,但事实已分布在所有现有答案(甚至是已删除的答案)上,我也不知道该接受哪个答案。因此,我将接受最佳答案,即所有三种比较可能性
问题内容: 假设我有两个表,表A和表B,并且我想比较某个列。 例如, 表A包含以下列:IP,主机,应用 表B具有以下列:IP,数据中心,服务器,模型,最后更新 如何比较两个表之间的IP列以获取差异? 我知道表是否具有相同的列,我可以使用并集和“减号”来获取差异,但是我无法找出表具有不同列的方式。 谢谢! 问题答案: 这将输出两个表中不匹配行的所有列,并且在任一侧都有NULL。