web-dev-qa-db-fra.com

Comment utiliser les fonctions de fenêtre dans PySpark?

J'essaie d'utiliser certaines fonctions Windows (ntile et percentRank) pour un bloc de données mais je ne sais pas comment les utiliser.

Quelqu'un peut-il m'aider avec ça sil-vous-plait? Dans la documentation de l'API Python il n'y a aucun exemple à ce sujet.

Plus précisément, j'essaie d'obtenir des quantiles d'un champ numérique dans ma trame de données.

J'utilise spark 1.4.0.

15
jegordon

Pour pouvoir utiliser la fonction de fenêtre, vous devez d'abord créer une fenêtre. La définition est à peu près la même que pour le SQL normal, cela signifie que vous pouvez définir l'ordre, la partition ou les deux. Commençons par créer des données factices:

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)])

Assurez-vous que vous utilisez HiveContext (Spark <2.0 uniquement):

from pyspark.sql import HiveContext

assert isinstance(sqlContext, HiveContext)

Créez une fenêtre:

from pyspark.sql.window import Window

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

ce qui équivaut à

(PARTITION BY k ORDER BY v) 

en SQL.

En règle générale, les définitions de fenêtre doivent toujours contenir PARTITION BY clause sinon Spark déplacera toutes les données vers une seule partition. ORDER BY est requis pour certaines fonctions, tandis que dans différents cas (généralement des agrégats) peut être facultatif.

Il existe également deux options qui peuvent être utilisées pour définir la durée de la fenêtre - ROWS BETWEEN et RANGE BETWEEN. Ceux-ci ne nous seront pas utiles dans ce scénario particulier.

Enfin, nous pouvons l'utiliser pour une requête:

from pyspark.sql.functions import percentRank, ntile

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

Notez que ntile n'est en aucun cas lié aux quantiles.

25
zero323