rom*_*ana 17 compare scala bigdata apache-spark spark-dataframe
我们这里有两个数据框:
预期的数据帧:
+------+---------+--------+----------+-------+--------+
|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|
+------+---------+--------+----------+-------+--------+
Run Code Online (Sandbox Code Playgroud)
和实际数据框:
+------+---------+--------+----------+-------+--------+
|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|
+------+---------+--------+----------+-------+--------+
Run Code Online (Sandbox Code Playgroud)
两个数据帧之间的区别现在是:
+------+--------+--------+----------+-------+--------+
|emp_id|emp_city|emp_name| emp_phone|emp_sal|emp_site|
+------+--------+--------+----------+-------+--------+
| 4| sanjose| romino|9848022331| 45123|SanRamon|
+------+--------+--------+----------+-------+--------+
Run Code Online (Sandbox Code Playgroud)
我们使用的是except函数df1.except(df2),但问题是,它返回的是不同的整行.我们想要的是查看该行中哪些列是不同的(在这种情况下,"romin"和"emp_name"中的"romino"不同).我们遇到了巨大的困难,任何帮助都会很棒.
him*_*ian 34
从上面问题中描述的场景看,似乎必须在列之间找到差异,而不是在行之间找到差异.
因此,为了做到这一点,我们需要在这里应用选择性差异,这将为我们提供具有不同值的列以及值.
现在,要应用选择性差异,我们必须编写如下代码:
首先,我们需要在预期和实际数据帧中找到列.
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|
+--------+
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!