2017-04-26 2 views
3

저는 Databricks의 스파크로 작업하고 있습니다. 프로그래밍 언어는 스칼라입니다.Spark - 스칼라 - 다른 데이터 프레임의 조회 값으로 데이터 프레임의 값 바꾸기

나는 두 개의 데이터 프레임이 있습니다

  • 메인 데이터 프레임을 : 1
  • 조회 데이터 프레임 : 스크린 샷보기 스크린 샷을 참조하십시오 3

나는 싶습니다 :

  • 메인 데이터 프레임에서 "Age"== - 1 인 모든 행 찾기
  • dataframe 2에 해당 행
  • 룩의 "제목"가치
  • 봐이 제목을 가진 사람들의 평균 연령은
  • 업데이트이 값을 주 dataframe의 나이를 확인할 수 있습니다.

나는 이것을 수행하는 방법에 대해 머리를 망쳤습니다. 필자가 생각해 낸 유일한 점은 데이터 프레임을 databricks의 테이블로 저장하고 SQL 문 (sql.Context.Sql ...)을 사용하여 매우 복잡해졌습니다.

더 효율적인 방법이 있는지 궁금합니다.

편집 : 카롤 Sudol에 추가 재현 예를

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

솔루션 덕분에

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

감사합니다. 이것은 효과적이었습니다 (원래 질문에 대한 나의 업데이트 참조). 'Age'열의 제목이 'avg_age'로 바뀌었지만 나이가 있던 원래 연령이 그대로 유지됩니다. 또한 동영상 링크에 감사드립니다. 매우 도움이됩니다. – Laura

관련 문제