【问题标题】:How to compare two dataframe and print columns that are different in scala如何比较scala中不同的两个数据框和打印列
【发布时间】:2017-11-04 10:11:49
【问题描述】:

我们这里有两个数据框:

预期的数据框:

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

我们正在使用异常函数 df1.except(df2),但问题是,它返回不同的整个行。我们想要的是查看该行中哪些列不同(在这种情况下,“emp_name”中的“romin”和“romino”是不同的)。我们在这方面遇到了巨大的困难,任何帮助都会很棒。

【问题讨论】:

  • 内连接并保留两个emp_name并删除两者相同的所有行。
  • 你能对数据做出假设吗?例如,您可以假设 emp_id 是唯一的吗?甚至更好必须是相同的,并且只有对其数据的验证是相关的?否则,为什么这一行在 emp_name 中不同,并且与其他 emp_id 中的一个不完全不同

标签: scala apache-spark apache-spark-sql compare


【解决方案1】:

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

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

现在,要应用选择性差异,我们必须编写如下代码:

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

    val 列 = df1.schema.fields.map(_.name)

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

    val 选择性差异 = columns.map(col => df1.select(col).except(df2.select(col)))

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

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

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

+--------+
|emp_name|
+--------+
|  romino|
+--------+

我希望这会有所帮助!

【讨论】:

  • 这是完美的@himanshullTian。非常感谢。我有前两个步骤,但错过了最后一个关键步骤!一个后续问题是,如果实际数据框中有额外的行怎么办? (预期有 4 行,实际有 5 行)。我们如何区分并打印整行而不是打印每一列?
  • Scala 语法让我很困惑。任何人都可以在 PySpark 中解释这一点吗?
  • 这很棒@himanshullTian。我不得不在 Spark-Java 中做类似的事情来比较两个大型 csv 文件的内容——尽管我没有使用 columns.map——我遍历了 csv 标头数组。
【解决方案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()

【讨论】:

  • 那么,这将为您提供两个数据框中列的不同行?
  • 它将遍历每一列并给出所有行的值不同的所有列的列表。
猜你喜欢
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-21
  • 2020-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多