首页 > 解决方案 > Spark中的数据框比较:Scala

问题描述

我在 spark/scala 中有两个数据框,其中我有一些常见的列,如薪水、奖金、增量等。我需要比较这两个数据框的列,并且第一个数据框薪水为 3000 和第二个数据框薪水为 5000 等任何变化然后我需要在新数据框中插入 5000-3000=2000 作为薪水,如果在第一个数据框中薪水是 5000,在第二个数据框中薪水是 3000,那么我需要在新数据框中插入 5000+3000=8000 作为薪水,如果薪水相同在两个数据帧中,然后需要从第二个数据帧插入。

    val columns = df1.schema.fields.map(_.salary)
    val salaryDifferences = columns.map(col => df1.select(col).except(df2.select(col)))
    salaryDifferences.map(diff => {if(diff.count > 0) diff.show})

我尝试了上面的查询,但是它给出的列和值在哪里有任何差异,我还需要检查差异是负数还是正数,并且基于此我需要执行逻辑。谁能给我一个提示,我该如何实现这个并插入记录在第三个数据帧中,

标签: apache-sparkapache-spark-sql

解决方案


加入数据框并使用嵌套whenotherwise子句。还可以在代码中找到注释

import org.apache.spark.sql.functions._

object SalaryDiff {

  def main(args: Array[String]): Unit = {
    val spark = Constant.getSparkSess
    import spark.implicits._

    val df1 = List(("1", "5000"), ("2", "3000"), ("3", "5000")).toDF("id", "salary") // First dataframe

    val df2 = List(("1", "3000"), ("2", "5000"), ("3", "5000")).toDF("id", "salary") // Second dataframe

    val df3 = df1   // Is your 3rd tables
      .join(
        df2
        , df1("id") === df2("id")    // Join both dataframes on id column
      ).withColumn("finalSalary", when(df1("salary") < df2("salary"), df2("salary") - df1("salary")) // 5000-3000=2000 check
      .otherwise(
      when(df1("salary") > df2("salary"), df1("salary") + df2("salary"))  // 5000+3000=8000  check
        .otherwise(df2("salary"))))    // insert from second dataframe
      .drop(df1("salary"))
      .drop(df2("salary"))
      .withColumnRenamed("finalSalary","salary")
      .show()

  }

}


推荐阅读