【问题标题】:Scala code to label rows of data frame based on another data frameScala代码基于另一个数据框标记数据框的行
【发布时间】:2017-05-30 19:51:49
【问题描述】:

我刚开始学习 scala 进行数据分析,当我尝试根据另一个数据框标记我的数据行时遇到了问题。

假设我有一个df1,其中列"date","id","value","label" 在开头设置为"F",用于df1 中的所有行。然后我有这个df2,这是一组较小的数据集,列"date","id","value"。然后我想将df1中的行标签从"F"更改为"T",如果该行出现在df2中,即某行df2 中的 ("date","id","value")df1 中的那一行具有相同的组合。

我尝试使用df.filterdf.join,但似乎两者都无法解决我的问题。

【问题讨论】:

  • 你到目前为止做了什么可以分享一下吗?
  • 您使用什么数据帧?火花?
  • 是的,我正在使用 spark!感谢答案,两者都有帮助!

标签: scala apache-spark spark-dataframe


【解决方案1】:

我想这就是你要找的。​​p>

val spark =SparkSession.builder().master("local").appName("test").getOrCreate()

import spark.implicits._
      //create Dataframe 1
    val df1 = spark.sparkContext.parallelize(Seq(
      ("2016-01-01", 1, "abcd", "F"),
      ("2016-01-01", 2, "efg", "F"),
      ("2016-01-01", 3, "hij", "F"),
      ("2016-01-01", 4, "klm", "F")
    )).toDF("date","id","value", "label")

  //Create Dataframe 2
  val df2 = spark.sparkContext.parallelize(Seq(
    ("2016-01-01", 1, "abcd"),
    ("2016-01-01", 3, "hij")
  )).toDF("date1","id1","value1")

  val condition = $"date" === $"date1" && $"id" === $"id1" && $"value" === $"value1"

  //Join two dataframe with above condition
  val result = df1.join(df2, condition, "left")

//  check wather both fields contain same value and drop columns 
  val finalResult = result.withColumn("label", condition)
    .drop("date1","id1","value1")
//Update column label from true false to T or F
  finalResult.withColumn("label", when(col("label") === true, "T").otherwise("F")).show

【讨论】:

    【解决方案2】:

    基本思路是将两者结合,然后计算结果。像这样的:

    df2Mod = df2.withColumn("tmp", lit(true))
    joined = df1.join(df2Mod , df1("date") <=> df2Mod ("date") && df1("id") <=> df2Mod("id") && df1("value") <=> df2Mod("value"), "left_outer")
    joined.withColumn("label", when(joined("tmp").isNull, "F").otherwise("T")
    

    我们的想法是我们添加“tmp”列,然后进行 left_outer 连接。对于不在 df2 中的所有内容,“tmp”将为空,因此我们可以使用它来计算标签。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 2022-11-15
      • 1970-01-01
      • 2023-01-26
      • 2016-05-10
      相关资源
      最近更新 更多