我们这里有两个数据框:
预期的数据框:
+------+---------+--------+----------+-------+--------+
|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”和“emp_name”中的“romino”不同)。我们遇到了巨大的困难,任何帮助都会很棒。
答案 0 :(得分:29)
从上述问题中描述的场景看,似乎必须在列之间找到差异而不是行。
所以,为了做到这一点,我们需要在这里应用选择性差异,这将为我们提供具有不同值的列以及值。
现在,为了应用选择性差异,我们必须编写类似这样的代码:
首先,我们需要在预期数据帧和实际数据帧中找到列。
val columns = df1.schema.fields.map(_。name)
然后我们必须逐列找出差异。
val selectiveDifferences = columns.map(col => df1.select(col).except(df2.select(col)))
最后,我们需要找出哪些列包含不同的值。
selectiveDifferences.map(diff => {if(diff.count> 0)diff.show})
而且,我们只会得到包含不同值的列。像这样:
+--------+
|emp_name|
+--------+
| romino|
+--------+
我希望这有帮助!
答案 1 :(得分:2)
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()