2014-06-12 17 views

cevap

6

Güncellemesi (2016/03/16): Çoğu sorguları için HER artık gereklidir ve aslında bu hatayı görme olasılığını artırabilir. Sorgunuzdaki her JOIN ve GROUP BY'den EACH anahtar kelimesini çıkarırsanız, sorgu motoru bu hatayı ortadan kaldırmak için sorgunuzu dinamik olarak optimize edecektir.

Hala EACH anahtar sözcüğünü belirterek bir sorgu çalıştırma (veya daha hızlı koşma) belirtebilen, ancak genellikle BigQuery ekibinin sorgunuzu, önce EACH olmadan denemenizi tavsiye ettiği köşe durumları vardır. Çok yakında, EACH anahtar sözcüğü tam bir no-op haline gelecektir.


Orjinal cevap: Eğer HER anahtar kelimeyi kullandığınızda HER TARAFINDAN HER veya GROUP JOIN veya BY yan tümcesinde anında, BigQuery bölümleri ("shuffles") verilerinizi Bir bölüm kullandığınızda göre Her çalışan görevinin, birleştirme veya toplama işleminin bölümünü yerel olarak gerçekleştirmesine izin veren anahtarları veya grup anahtarlarını birleştirin.

Kaynaklar, bu tür bir çalışan çok fazla veri aldığında ve sınırını aştığında hatayla karşılaşıldı.

  1. Skew: Genellikle iki kategoriye, bu hata sonbaharda nedenlerini konuşan verileri (diyelim ki, bir "misafir" kullanıcı kimliği veya boş anahtarı), biri yani bir anahtar değeri doğru ağır çarpık çalışan bu anahtar için tüm kayıtları alır ve aşırı yüklenir.

  2. Veri boyutunda ve çalışan sayısında uyuşmazlık: BigQuery'nin sorgunuzu atadığı çalışan sayısı için çok fazla veriniz.

Her iki senaryo ile başa çıkmamıza yardımcı olmak için, bu sorunlar hakkında endişelenmenize gerek kalmaması için çeşitli geliştirmeler üzerinde çalışıyoruz. Ancak, şu an için, aşağıdaki yaklaşımlardan biriyle sorunu giderebilirsiniz:

  1. Eğri tuşları filtrele. Birleştirme sonuçlarınızın gerçek değeri boş olduğundan, verileriniz eğriyse, birleştirmeden önce WHERE key IS NOT NULL ekleyerek bunları filtreleyebilirsiniz. İşlenen veri miktarını azaltın. Birleştirmenin her iki yüzüne WHERE ABS(HASH(key)) % 5 == 0 ile birleştirerek birleştirmeyi yalnızca 1/5 veriye (ya da istediğiniz herhangi bir fraksiyona) uygulayın ve aynısını == 1, == 2, == 3, == 4 ayrı sorgularda yapın. Sorguyu iletmek için verileri daha küçük parçalarda elle paylaşıyorsunuz - ancak aynı verileri 5 kez sorguladığınız için 5 kat daha fazla ödeme yaptığınızı unutmayın.

  2. Sorgunuzu tekrar gözden geçirin. Belki de sorgunuzu tamamen farklı bir şekilde oluşturabilir veya istediğiniz aramayı elde etmek için bazı ara sonuçları hesaplayabilirsiniz.

+0

Burada belirtilen geçici çözümler üzerinde ayrıntılı bilgi verir misiniz? Ben tek bir çalışan görevi "aşırı yükleme" olmadan tür sonuçları BY TARAFINDAN benzer sonuçlar elde etmek için bazı akıllı hileler olduğunu anlamak doğru muyum? –

+0

Güncellendi.PARTITION BY ile ilgili sorunuzu anladığımdan emin değilim, ancak PARTITION BY, GROUP EACH BY ve JOIN EACH öğelerinin aynı şekilde verileri dinamik olarak bölümlere ayırdığını ve yeni sorgu motorumuz tarafından desteklenen aynı dinamik optimizasyonlardan yarar sağladığını unutmayın. . (Başka bir deyişle: Çoğu durumda, sadece sorgunuzu yazın, EACH'yi atlayın ve BQ'nun sizin için çalışmasını sağlayın.) –

İlgili konular