Ответ 1
Чтобы иметь возможность использовать функцию окна, вы должны сначала создать окно. Определение почти такое же, как для обычного 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
требуется для некоторых функций, тогда как в разных случаях (как правило, агрегаты) может быть необязательным.
Есть также два дополнительных параметра, которые можно использовать для определения интервала окна - 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
не связан с ntile
.