0

Bir PySpark işi çalıştırıyorum ve ben şu mesajı alıyorum:PySpark için Pencere işlevi bölümü nasıl ayarlanır?

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation. 

mesajı neyi ifade eder ve nasıl bir pencere operasyon için bir bölüm tanımlıyorsunuz?

DÜZENLEME: Bütün bir sütun üzerinde sıralamak için çalışıyorum

.

My veri olarak düzenlenmiştir:

A 
B 
A 
C 
D 

Ve istediğim:

A,1 
B,3 
A,1 
C,4 
D,5 

sanmıyorum orada gerektiği bunun için bir .partitionBy() tarafından, sadece .orderBy(). Sorun şu ki, bu performans düşüşüne sebep oluyor. Pencere işlevi olmadan bunu başarmanın başka bir yolu var mı? İlk sütuna göre bölümlemek için

, sonuç şöyle olacaktır: Ben istemiyorum Hangi

A,1 
B,1 
A,1 
C,1 
D,1 

.

+0

, kabul edin Bu yüzden bu soruyu kapatabiliriz! – eliasah

+0

Üzgünüz, henüz hiçbir cevap henüz bir çözüm sağladı. – cshin9

+0

@ cshin9 Aslında, mevcut cevap tam olarak sorunuzu ele alıyor. Etkin bölümleme yapmadan pencere fonksiyonu yapabilen özel bir sihir yoktur. – zero323

cevap

2

soru üzerine verilen bilgiler, en iyi ihtimalle ben bölmeler Pencere fonksiyonları üzerindeki tanımlanmalıdır nasıl bir iskeletini sağlayabilir Verilen:

OVER (PARTITION BY ... ORDER BY …) 
:

from pyspark.sql.window import Window 

windowSpec = \ 
    Window \ 
    .partitionBy(...) \ # Here is where you define partitioning 
    .orderBy(…) 

Bu aşağıdaki SQL eşdeğerdir

Böylelikle bölümleme belirtimi ile ilgili: satırlar, verilen satırla aynı bölüm içinde olacak. Çerçeve sütununu sipariş etmeden ve hesaplamadan önce, bölüm sütunu için aynı değere sahip tüm satırların aynı makineye toplandığından emin olmak isteyebilirsiniz.

herhangi bölümleme şartname vermezseniz

, sonra tüm veriler tek bir makineye toplanması gereken, böylece aşağıdaki hata iletisi: cevapların biri sorunlarınızı çözer eğer

WARN org.apache.spark.sql.execution.Window: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation. 
+1

Tüm tablo tarafından sipariş vermek istiyor ve .partitionBy() kullanılmıyorsa ne olur? Bunu yapmanın daha verimli bir yolu var mı? (yani RANK() ÜZERİNDEN (ORDER BY ...) – cshin9

+1

tek etkili yol bölümlemedir! – eliasah

+2

Tüm tablo üzerinde sıralanırsam ne bölümlemeliyim Bölme, her bölüm için sıralamayı ayrı ayrı yapmak istediğimi ima eder. – cshin9