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