2015-08-06 6 views
5

Я пытаюсь использовать некоторые функции windows (ntile и percentRank) для фрейма данных, но я не знаю, как их использовать.Как использовать функции окна в PySpark?

Может ли кто-нибудь помочь мне с этим, пожалуйста? в документации по API Python нет примеров. (http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=ntile#pyspark.sql.functions.ntile)

В частности, я пытаюсь получить квантили числового поля в моем кадре данных.

Я использую искру 1.4.0.

ответ

9

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

Смежные вопросы