2017-11-10 5 views
0

こんにちは、おかげさまで多くのご協力をいただきました。マップ関数から生成された可変数のDataFramesをスパーク(scala)でマージする

私は2つのDataFramedfMaindfStringタイプ("col1", "col2", "col3")の3列の両方を有します。私は、dfの各行(r)に関数をマップする必要があり、いくつかの基準に基づいて、dfMainにある要素を選択して選択し、サンプリングします。最終結果は統合されたDataFrame(つまりDataset[Row])として返されます。私のバグの不完全な(スカラ)ソリューションは以下の通りです。 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

こんにちはラメッシュさん、ありがとうございました。基本的には、マップには 'dfMain'から要素を選択するための基準があります。 'df'の各行について、これらの基準を使って' dfMain'のいくつかの要素を選択する必要があります(私はこれらのケースの1つを私の質問で書いています)。 'map'の基準がより複雑になることがあるので、' df'の各行の 'map'の結果(マップによって生成されたDataFrames)を一緒にマージすることができる解決法を理解できます。生成されたDataFramesをマージするためのソリューションはありますか? –

+0

以下の解決策はありませんでしたか?別のデータフレームのマップ内でデータフレームを使用することはできません。唯一の解決策は、それらに参加することです。 2つのデータフレームをマージするために共用体を使用できます。 –

答えて

0

あなたは今、あなたはそのcol1ないdfMainからfilter inrowsしようとしている、質問にあなたのコードで

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

​​

として2 dataframes探しているとしましょうdf col1に等しく、残りの2つの列は等しい、すなわち.filter($"col1" !== r.col1 && $"col2" === r.col2 && $"col3" === r.col3)である。ケースのthatsなら、あなたはjoinあなたがdfMainのだけcolumnsをしたい場合は今、あなたはどのべき

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 | 
+----+----+----+----+----+----+ 

を与える必要があります

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 | 
+----+----+----+ 

としてデータフレームを生成する必要がありますそれとも、両方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") 

を行う必要があります。

関連する問題