2017-11-20 9 views
1

これはデータフレームからの列値に基づいて変更する必要がある私のpartitionBy条件です。列の値ごとに異なるウィンドウ指定を使用する方法は?

val windowSpec = Window.partitionBy("col1", "clo2","clo3").orderBy($"Col5".desc) 

ここで、データフレーム内の列(col6)の1つの値がIであれば、上記の条件が満たされます。

しかしカラム(COL6)の値は、条件

val windowSpec = Window.partitionBy("col1","clo3").orderBy($"Col5".desc) 

の下Oを変更したときにどうすれば火花データフレームでそれを実現することができます。

レコードごとに、それはCOL6はそのpartitionBy条件に基づいて、IまたはOであるかどうかをチェックするようなので、それは私が、col6列の値に基づいて、最終的なウィンドウの仕様を選択するための要件を考えると

+2

ウィンドウアグリゲーションの適用前に 'フィルタリング 'しないでください。 –

+0

@JacekLaskowski 1つの例でフィルタも条件に基づいているので、 ...後で他の変換で必要となる列を削除することはできません –

+1

例を挙げてください。私の頭の上から、アイデアはありますが、それを書き留めるには詳細が必要です! – eliasah

答えて

1

を適用されます。最初にfilterを実行し、最後にウィンドウの集約を行います。上記のデータセットで

scala> dataset.show 
+----+----+----+----+----+ 
|col1|col2|col3|col5|col6| 
+----+----+----+----+----+ 
| 0| 0| 0| 0| I| // <-- triggers 3 columns to use 
| 0| 0| 0| 0| O| // <-- the aggregation should use just 2 columns 
+----+----+----+----+----+ 

は、私が col6に少なくとも1つの Iをありますかどうかを確認し、ウィンドウの仕様を適用する filterを思います。

val windowSpecForIs = Window.partitionBy("col1", "clo2","clo3").orderBy($"Col5".desc) 
val windowSpecForOs = Window.partitionBy("col1","clo3").orderBy($"Col5".desc) 

val noIs = dataset.filter($"col6" === "I").take(1).isEmpty 
val windowSpec = if (noIs) windowSpecForOs else windowSpecForIs 
+1

ありがとうございました...私はこの答えを試し、あなたに応答します –

+0

少なくとも私たちは議論し、改善することがあります。あなたからのお話を待つことはできません。 –

+0

@Anupam、私もそうするだろう。元のデータフレームを分離して論理を別々に適用し、最終的に結合する。 :) –

関連する問題