2015-08-06 20 views
5

Bir veri çerçevesi için bazı Windows işlevlerini (ntile ve percentRank) kullanmaya çalışıyorum ancak bunları nasıl kullanacağımı bilmiyorum.PySpark'ta pencere işlevleri nasıl kullanılır?

Bu konuda bana yardımcı olabilecek herhangi biri var mı? Python API dokümantasyonunda bunun hakkında bir örnek yoktur. (http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=ntile#pyspark.sql.functions.ntile)

Özellikle, veri çerçevemde sayısal bir alandan nicelikler almaya çalışıyorum.

Spark 1.4.0 kullanıyorum.

cevap

9
Pencere fonksiyonunu kullanabilmek için önce bir pencere oluşturmanız gerekir. Tanım normal SQL ile hemen hemen aynıdır, yani sipariş, bölüm veya her ikisini de tanımlayabilirsiniz. (Sadece < 2.0 Spark) Eğer HiveContext kullandığınızdan emin olun

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

:

from pyspark.sql.window import Window 

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

eşdeğerdir:

from pyspark.sql import HiveContext 

assert isinstance(sqlContext, HiveContext) 

bir pencere oluşturma İlk bazı kukla veri oluşturmanızı sağlar

(PARTITION BY k ORDER BY v) 
SQL'de 10

.

Başparmak penceresi tanımlarının bir kuralı her zaman PARTITION BY maddesini içermelidir, aksi takdirde Spark tüm verileri tek bir bölüme taşır. Bazı işlevler için ORDER BY gereklidir, ancak farklı durumlarda (genellikle kümeler) isteğe bağlı olabilir.

Ayrıca, pencere açıklığını tanımlamak için kullanılabilecek iki isteğe bağlı vardır: - ROWS BETWEEN ve RANGE BETWEEN. Bunlar bu senaryoda bizim için yararlı olmayacaktır.

Sonunda bir sorgu için kullanabilirsiniz: quantiles hiçbir şekilde ilgili değildir

from pyspark.sql.functions import percentRank, ntile 

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

Not ntile söyledi.

İlgili konular