Spark - Scala - 使用来自另一个数据框的查找值替换数据帧中的值

时间:2017-04-26 11:21:12

标签: scala apache-spark

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

我有两个数据框:

  • 主要数据框:请参见屏幕截图:1
  • 查找数据框:查看屏幕截图3

我想:

  • 查找主数据框中“Age”== - 1的所有行
  • 查看该行的“标题”值
  • 查看数据框2,了解具有此标题的人的平均年龄
  • 使用此值更新主数据框中的年龄。

我已经破坏了如何做到这一点。我想出的唯一一件事就是将数据帧存储为databricks中的表并使用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()

1 个答案:

答案 0 :(得分:1)

val df = dfMain.filter("age == -1").join(dfLookUp, Seq("title")).select(col("title"), col("avg"), ......)
如果您想保留任何其他值,请在left/right/outer join的下一步使用main DF

浏览教程:databricks training