web-dev-qa-db-ja.com

PySparkでウィンドウ関数を使用する方法は?

データフレームにいくつかのウィンドウ関数(ntileおよびpercentRank)を使用しようとしていますが、使用方法がわかりません。

誰でもこれを手伝ってくれますか? Python APIドキュメント には、例はありません。

具体的には、データフレーム内の数値フィールドの変位値を取得しようとしています。

私はspark 1.4.0を使用しています。

15
jegordon

ウィンドウ機能を使用するには、最初にウィンドウを作成する必要があります。定義は通常のSQLとほぼ同じです。つまり、順序、パーティション、またはその両方を定義できます。まず、ダミーデータを作成します。

import numpy as np
np.random.seed(1)

keys = ["foo"] * 10 + ["bar"] * 10
values = np.hstack([np.random.normal(0, 1, 10), np.random.normal(10, 1, 100)])

df = sqlContext.createDataFrame([
   {"k": k, "v": round(float(v), 3)} for k, v in Zip(keys, values)])

HiveContextを使用していることを確認してください(Spark <2.0のみ):

from pyspark.sql import HiveContext

assert isinstance(sqlContext, HiveContext)

ウィンドウを作成します。

from pyspark.sql.window import Window

w =  Window.partitionBy(df.k).orderBy(df.v)

これは

(PARTITION BY k ORDER BY v) 

sQLで。

経験則として、ウィンドウ定義には常にPARTITION BY句を指定しない場合Sparkはすべてのデータを単一のパーティションに移動します。ORDER BYは一部の関数に必要ですが、異なる場合(通常は集約)はオプションです。

また、ウィンドウスパンの定義に使用できる2つのオプションがあります-ROWS BETWEENおよびRANGE BETWEEN。これらは、この特定のシナリオでは役に立ちません。

最後に、クエリに使用できます。

from pyspark.sql.functions import percentRank, ntile

df.select(
    "k", "v",
    percentRank().over(w).alias("percent_rank"),
    ntile(3).over(w).alias("ntile3")
)

ntileは、変位値とは何の関係もありません。

25
zero323