2016-11-04 16 views

cevap

1

repartition(COL)'u çalıştırırsanız, hesaplamalar sırasında bölümlemeyi değiştirirsiniz - spark.sql.shuffle.partitions (varsayılan: 200) bölümleri alırsınız. Daha sonra .write numaralı telefonu arayarak çok sayıda dosya içeren bir dizin alırsınız.

Eğer .write.partitionBy(COL) çalıştırırsanız o zaman sonuç olarak size COL benzersiz değerlerin olduğu kadar çok dizinleri alacak. Bu, daha fazla veri okumayı hızlandırır (bölümleme sütununa göre filtreleme yaparsanız) ve depolama alanına biraz yer kazandırır (bölümleme sütunu veri dosyalarından kaldırılır).

12

dikkat: Kabul cevap oldukça doğru değil inanıyoruz! Bu soruyu sorduğunuz için sevindim, çünkü benzer şekilde adlandırılan bu işlevlerin davranışı, resmi kıvılcım belgelerinde iyi belgelenmemiş önemli ve beklenmedik şekillerde farklıdır.

Kabul edilen yanıtın ilk kısmı doğru: df.repartition(COL, numPartitions=k) çağrısı, karma tabanlı bir bölümleyici kullanarak k bölümleri içeren bir veri çerçevesi oluşturacaktır. COL burada bölümleme anahtarını tanımlar - tek bir sütun veya sütun listesi olabilir. Karma tabanlı bölümleyici, her bir giriş satırının bölüm anahtarını alır ve bölümlerini partition = hash(partitionKey) % k gibi bir şey aracılığıyla keser. Bu, aynı bölüm anahtarına sahip tüm satırların aynı bölümde bittiğini garanti eder. Ancak, (bölüm tuşları arasında bir karma çarpışma meydana geldiğinde) çoklu bölüm anahtarlardan satırlar da aynı bölüm de gidebilirler ve bazı bölümleri boş olabilir.

Özetle, df.repartition(COL, numPartitions=k) ait unintuitive hususların k bölümleri bazıları boş olabilir diğerleri birden bölüm tuşları gelen satır içerebilir, oysa

  • bölümleri kesinlikle bölme anahtarları
  • ayırmak olmaz vardır

df.write.partitionBy davranışı birçok kullanıcı beklemek olmaz bir şekilde, oldukça farklıdır. Çıktı dosyalarınızın tarih bölümlü olmasını ve verilerinizin 7 günden fazla olmasını istediğinizi varsayalım. Ayrıca, df'un başlaması için 10 bölümün olduğunu varsayalım. df.write.partitionBy('day')'u çalıştırdığınızda, kaç tane çıktı dosyası beklemeniz gerekir? Cevap, duruma bağlı'. df yılında başlangıç ​​bölümleri her bölüm her güne ait verileri içeriyorsa df daki başlangıç ​​bölümleri her tam olarak bir güne ait verileri içeriyorsa, o zaman cevap 70, daha sonra cevap 10.

nasıl açıklayabiliriz olduğunu bu davranış? df.write'u çalıştırdığınızda, df'daki orijinal bölümlerin her biri bağımsız olarak yazılır. Yani, orijinal 10 bölümünüzün her biri 'gün' sütununda ayrı bölümlere ayrılır ve her alt bölüm için ayrı bir dosya yazılır.

Bu davranışı oldukça can sıkıcı buluyorum ve dataframes yazarken global bir yeniden bölümleme yapmanın bir yolu olmasını diliyorum.