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.