如何比较scala中不同的两个数据框和打印列

时间:2017-06-02 22:47:37

标签: scala apache-spark compare spark-dataframe bigdata

我们这里有两个数据框:

预期的数据框:

+------+---------+--------+----------+-------+--------+
|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”不同)。我们遇到了巨大的困难,任何帮助都会很棒。

2 个答案:

答案 0 :(得分:29)

从上述问题中描述的场景看,似乎必须在列之间找到差异而不是行。

所以,为了做到这一点,我们需要在这里应用选择性差异,这将为我们提供具有不同值的列以及值。

现在,为了应用选择性差异,我们必须编写类似这样的代码:

  1. 首先,我们需要在预期数据帧和实际数据帧中找到列。

      

    val columns = df1.schema.fields.map(_。name)

  2. 然后我们必须逐列找出差异。

      

    val selectiveDifferences = columns.map(col => df1.select(col).except(df2.select(col)))

  3. 最后,我们需要找出哪些列包含不同的值。

      

    selectiveDifferences.map(diff => {if(diff.count> 0)diff.show})

  4. 而且,我们只会得到包含不同值的列。像这样:

    +--------+
    |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()