2017-11-10 5 views
0

안녕하세요. 미리 도움을 주셔서 감사합니다.맵 함수에서 생성 된 DataFrames의 가변 개수의 데이터를 병합하십시오.

제가 DataFrame 두 (dfMaindf)를 String 형 ("col1", "col2", "col3")의 3 열을 모두 가지고있다. 함수를 df의 각 행 (r)에 매핑하고 일부 기준에 따라 dfMain에있는 요소를 선택하고 선택하고 샘플링해야합니다. 최종 결과는 통합 된 DataFrame (즉, Dataset[Row])으로 반환되어야합니다. 내 버그가있는 불완전한 (scala) 솔루션은 아래에 있습니다. map의 기준이 더 복잡해질 수 있기 때문에 좀 더 일반적이고 map (즉, 생성 된 DataFrames)의 결과를 병합 할 수있는 솔루션을 병합해야합니다.

case class record(col1: String, col2:String, col3:String) 

def myFun(df: DataFrame) : DataFrame = { 
    df.as[record].map{ 
    r => dfMain.filter($"col1" !== r.col1 && 
         $"col2" === r.col2 && 
         $"col3" === r.col3) 
       .sample(false,0.2) 
    } 
} 
+0

col1이 df col1과 같지 않고 나머지 2 개의 열이 같은 dfMain 행을 필터링하고 싶습니까? –

+0

안녕하세요, Ramesh 님, 감사합니다. 기본적으로,지도에서'dfMain'에서 요소를 선택하는 기준을 가지고 있습니다. 'df'의 각 행에 대해 이러한 기준을 사용하여'dfMain'의 일부 요소를 선택해야합니다 (필자는 이러한 질문 중 하나를 썼습니다). 'map'의 기준이 점점 복잡해질 수 있기 때문에,'df'의 각 행 (map에 의해 생성 된 DataFrames)의'map' 결과를 함께 병합 할 수있는 솔루션을 고맙게 생각합니다. 생성 된 DataFrames를 병합하는 솔루션이 있습니까? –

+0

내 솔루션이 도움이되지 않았습니까? 다른 데이터 프레임의 맵 안에는 데이터 프레임을 사용할 수 없습니다. 유일한 해결책은 그들과 합류하는 것입니다. 두 개의 데이터 프레임을 병합하는 데 유니언을 사용할 수 있습니다. –

답변

0

dfMain 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a1 |b1 |c1 | 
|a |b2 |c3 | 
|a |b3 |c4 | 
+----+----+----+ 

df 
+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a |b1 |c1 | 
|a |b2 |c2 | 
|a |b3 |c3 | 
+----+----+----+ 

지금 문제의 코드를 찾고 두 dataframes

로이 말을하자, 당신은하지 않습니다 dfMaincol1에서 filter in rows하려고하는 df col1이고 나머지 두 열은 동일합니다. 즉 .filter($"col1" !== r.col1 && $"col2" === r.col2 && $"col3" === r.col3)입니다. 경우 먹으 렴 경우에 당신은 당신이 단지 dfMaincolumns, 당신은

dfMain.as("main").join(df.as("table"), $"main.col1" =!= $"table.col1" && $"main.col2" === $"table.col2" && $"main.col3" === $"table.col3", "inner") 
    .select($"main.col1", $"main.col2",$"main.col3") 

을해야 할 것인지하는 당신에게 지금

+----+----+----+----+----+----+ 
|col1|col2|col3|col1|col2|col3| 
+----+----+----+----+----+----+ 
|a1 |b1 |c1 |a |b1 |c1 | 
+----+----+----+----+----+----+ 

을 제공한다 join

dfMain.as("main").join(df.as("table"), $"main.col1" =!= $"table.col1" && $"main.col2" === $"table.col2" && $"main.col3" === $"table.col3", "inner") 

로 이동해야하는해야 be

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a1 |b1 |c1 | 
+----+----+----+ 

그리고 당신은 단지 dfcolumns하려는 경우, 당신은

+----+----+----+ 
|col1|col2|col3| 
+----+----+----+ 
|a |b1 |c1 | 
+----+----+----+ 

로 dataframe을 생성해야 아니면 모두 dataframejoined의 혼합 출력을 할 수 있습니다

dfMain.as("main").join(df.as("table"), $"main.col1" =!= $"table.col1" && $"main.col2" === $"table.col2" && $"main.col3" === $"table.col3", "inner") 
    .select($"table.col1", $"table.col2",$"table.col3") 

을 수행해야합니다.