2017-04-26 113 views
3

我正在Spark上使用Databricks。編程語言是Scala。Spark - Scala - 用另一個數據幀中的查找值替換數據幀中的值

我有兩個數據幀:

  • 主要數據幀:見截圖:1
  • 查找數據幀:見截圖3

我想:

  • 查找主數據框中「年齡」== - 1的所有行
  • 看看該行
  • 看在數據幀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() 

解決方案感謝卡羅爾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() 
+0

請分享一個可重複的例子。 – mtoto

+0

我會研究一個不是一團糟的例子。我一擁有它,Wil就會更新。 – Laura

回答

1
val df = dfMain.filter("age == -1").join(dfLookUp, Seq("title")).select(col("title"), col("avg"), ......) 

main DF下一步使用left/right/outer join如果你想保留任何其他值。

通過教程:databricks training

+0

謝謝!這工作(請參閱我原來的問題的更新)。 「年齡」一欄現在名爲「avg_age」,但它仍然具有年齡存在的原始年齡。另外,感謝視頻的鏈接。很有幫助。 – Laura

相關問題