2016-12-20 8 views
0

SparkSQLでウィンドウ関数を使用すると、以下の警告メッセージが表示されます。誰も私にこの問題を解決する方法を教えてもらえますか?SparkSQLデータフレームでウィンドウ関数を使用中の警告メッセージ

警告メッセージ: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation.

マイコード: def calcPrevBrdrx(df: DataFrame): DataFrame = { val w = Window.orderBy("existing_col1") df.withColumn("new_col", lag("existing_col2", 1).over(w)) }

+0

基本的には、ウィンドウラグ機能を使用して 'existing_col2'と比較して1行だけ下にスライドする新しい列(new_col)を追加しています。 – Ramesh

+0

新しいデータフレームで新しい列 'new_col'が期待通りに正しく作成されていることがわかりました。しかし、上記のような警告メッセージが表示されています。 – Ramesh

答えて

0

警告がまさにそれが言うことです。一般に、ウィンドウ関数を使用するときは、最初にいくつかの列で分割し、その後にのみ順序付けを行います。たとえば、ユーザーのログがある場合は、ユーザーごとにパーティションを作成し、次に時間ごとに並べ替えることで、ユーザーごとにソートを個別に行うことができます。

パーティションがない場合、データフレーム全体がソートされます。これは、基本的には、単一のパーティションがあることを意味します。すべてのデータフレームのすべてのデータがその単一のパーティションに移動し、ソートされます。

これは遅いです(すべてをシャッフルしてからすべてをソートしています)。これは、すべてのデータがスケーラブルではない単一のパーティションに収まる必要があることを意味します。

ロジックを見て、以前に何かでパーティション化するのではなく、すべてを並べ替える必要があるかどうかを確認する必要があります。

+0

はい私はWindow.orderBy( "existing_col1")によってこれを試みました。partitionBy( "existing_col2"、 "existing_col3") – Ramesh

+0

はいこれをWindow.orderBy( "existing_col1")で行いました。 "existing_col3")しかし、私が追加している新しいフィールドnew_colは、すべての行に対してnullになっています。 – Ramesh

+0

2つの列を分割すると、タプルごとにデータがソートされます。タプルごとに1つの値がある場合は、(ラグがないので)nullが返されます。あなたが列 "existing_col2"のラグを見つけようとしているので、私はやります:Window.partitionBy( "existing_col2")。orderBy( "existing_col1") –