Spark 中的数据框比较:Scala

Posted

技术标签:

【中文标题】Spark 中的数据框比较:Scala【英文标题】:Dataframe Comparision in Spark: Scala 【发布时间】:2020-05-14 08:15:38 【问题描述】:

我在 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)

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

【问题讨论】:

【参考方案1】:

加入数据框并使用嵌套的whenotherwise 子句。 代码中也可以找到cmets

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

  



【讨论】:

所有这些值我需要插入到我的第三个表中。它会插入到我的第三个表中吗? df3 是你的第三张桌子@UpAp @UpAp 这回答了你的问题吗?如果是,请考虑投票+接受答案以结束问题 完成。非常感谢,是的,它对我有用。@ QuickSilver。我还面临一个问题,但与此无关,因此在此处发布了一个新问题。***.com/questions/61819955/…。如果您对此有任何想法,请提供帮助。

以上是关于Spark 中的数据框比较:Scala的主要内容,如果未能解决你的问题,请参考以下文章

Scala(Spark)连接数据框中的列[重复]

NotNull 条件不适用于 spark 数据框 scala 中的 withColumn 条件

将新行与spark scala中数据框中的前一行数据合并

如何访问存储在scala spark中的数据框中的映射值和键

我如何将平面数据框转换为 spark(scala 或 java)中的嵌套 json

如何在倾斜列上重新分区 Spark scala 中的数据框?