【问题标题】:Spark - Scala - Replacing value in dataframe with lookup value from another data frameSpark - Scala - 用来自另一个数据帧的查找值替换数据帧中的值
【发布时间】:2017-04-27 17:26:41
【问题描述】:

我正在 Databricks 上使用 Spark。编程语言是 Scala。

我有两个数据框:

  • 主要数据框:见截图:1
  • 查找数据框:见截图3

我想:

  • 在主数据框中查找“Age”==-1 的所有行
  • 查看该行的“title”值
  • 在数据框 2 中查看具有此头衔的人的平均年龄是多少
  • 使用此值更新主数据框中的年龄。

我对如何做到这一点感到头疼。我想出的唯一方法是将数据框存储为数据块中的表并使用 SQL 语句(sql.Context.Sql ...),这最终变得非常复杂。

我想知道是否有更有效的方法来做到这一点。

编辑:添加可重现的示例

import org.apache.spark.sql.functions._
val df = sc.parallelize(Seq(("Fred", 20, "Intern"), ("Linda", -1, "Manager"),  ("Sean", 23, "Junior Employee"), ("Walter", 35, "Manager"), ("Kate", -1, "Junior Employee"), ("Kathrin", 37, "Manager"), ("Bob", 16, "Intern"), ("Lukas", 24, "Junionr Employee")))
    .toDF("Name", "Age", "Title")

println("Data Frame DF")
df.show();


val avgAge = df.filter("Age!=-1").groupBy("Title").agg(avg("Age").alias("avg_age")).toDF()
println("Average Ages")
avgAge.show()

println("Missing Age")
val noAge = df.filter("Age==-1").toDF()
noAge.show()

感谢 Karol Sudol 的解决方案

val imputedAges = df.filter("Age == -1").join(avgAge, Seq("Title")).select(col("Name"),col("avg_age"), col("Title") )
imputedAges.show()

val finalDF= imputedAges.union(df.filter("Age!=-1"))
println("FinalDF")
finalDF.show()

【问题讨论】:

  • 请分享一个可重现的例子。
  • 我将处理一个并非一团糟的示例。我一有它就会更新。

标签: scala apache-spark


【解决方案1】:
val df = dfMain.filter("age == -1").join(dfLookUp, Seq("title")).select(col("title"), col("avg"), ......)

如果您想保留任何其他值,请在下一步中使用 left/right/outer joinmain DF

浏览教程:databricks training

【讨论】:

  • 谢谢!这有效(请参阅我对原始问题的更新)。 “年龄”列现在标题为“avg_age”,但它仍然具有存在年龄的原始年龄。另外,感谢视频的链接。很有帮助。
猜你喜欢
  • 1970-01-01
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 1970-01-01
  • 2015-12-19
  • 2019-08-06
  • 2018-01-23
相关资源
最近更新 更多