比较两个数据帧并更新值

时间:2018-04-20 09:09:57

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

我有两个数据框,如下所示。

val file1 = spark.read.format("csv").option("sep", ",").option("inferSchema", "true").option("header", "true").load("file1.csv")
file1.show()
+---+-------+-----+-----+-------+
| id|   name|mark1|mark2|version|
+---+-------+-----+-----+-------+
|  1| Priya |   80|   99|      0|
|  2| Teju  |   10|    5|      0|
+---+-------+-----+-----+-------+
val file2 = spark.read.format("csv").option("sep", ",").option("inferSchema", "true").option("header", "true").load("file2.csv")
file2.show()
+---+-------+-----+-----+-------+
| id|   name|mark1|mark2|version|
+---+-------+-----+-----+-------+
|  1| Priya |   80|   99|      0|
|  2| Teju  |   70|    5|      0|
+---+-------+-----+-----+-------+

现在我正在比较两个数据帧,并滤除这样的不匹配值。

val columns = file1.schema.fields.map(_.name)
val selectiveDifferences = columns.map(col => file1.select(col).except(file2.select(col)))
selectiveDifferences.map(diff => {if(diff.count > 0) diff.show})
+-----+
|mark1|
+-----+
|   10|
+-----+

我需要在数据帧中添加额外的行,1表示数据帧2的不匹配值,并更新版本号。

file1.show()
+---+-------+-----+-----+-------+
| id|   name|mark1|mark2|version|
+---+-------+-----+-----+-------+
|  1| Priya |   80|   99|      0|
|  2| Teju  |   10|    5|      0|
|  3| Teju  |   70|    5|      1|
+---+-------+-----+-----+-------+

我正在努力实现上述步骤,这是我的预期输出。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:4)

您可以使用exceptunion获取最终数据框,如下所示

val count = file1.count()

import org.apache.spark.sql.expressions._
import org.apache.spark.sql.functions._
file1.union(file2.except(file1)
                  .withColumn("version", lit(1))      //changing the version
                  .withColumn("id", (row_number.over(Window.orderBy("id")))+lit(count))   //changing the id number
  )

litrow_numberwindow函数用于生成ID和版本

注意使用窗口函数生成新的ID会使流程效率低下因为将在一个执行程序中收集所有数据以生成新的ID < / em>的