2015-02-24 9 views
6

BigQuery'de iki alt seçime ve bir katılmaya sahip bir sorguyu çalıştırmaya çalışıyorum ama işe yaramayacağım. Bir geçici çözüm olarak yaptığım şey, alt seçimleri kendi başlarına çalıştırmak, sonra bunları tablolar olarak kaydetmektir, sonra birleştirme ile başka bir sorgu yapmaktır, ancak bence bunu bir sorgu ile yapabilmem gerekir.Google BigQuery JOIN EACH için soru soruyor ama ben zaten kullanıyorum

Şu hatayı alıyorum:

Table too large for JOIN. Consider using JOIN EACH. For more details, please see https://developers.google.com/bigquery/docs/query-reference#joins

ama zaten bir her katılmak kullanıyorum. Çapraz birleştirmeyi kullanarak ve her biri tarafından grup kullanarak denedim, ancak bunlar bana farklı hatalar veriyor. Bu konu hakkında Yığın Taşması ile ilgili diğer sorular yardımcı olmaz, biri BigQuery'de bir hata olduğunu ve diğerinin 'çapraz birleştirmeyi' kullanan birileri olduğunu söylüyor ...

Aşağıda benim sql'm var, doluysa beni affet ancak hataların çalışması gerekir düşünüyorum:

select 
t1.device_uuid, 
t1.session_uuid, 
t1.nth, 
t1.Diamonds_Launch, 
t2.Diamonds_Close 
from (
    select 
    device_uuid, 
    session_uuid, 
    nth, 
    sum(cast([project_id].[table_id].attributes.Value as integer)) as Diamonds_Launch 
    from [project_id].[table_id] 
    where name = 'App Launch' 
    and attributes.Name = 'Inventory - Diamonds' 
    group by device_uuid, session_uuid, nth 
    ) as t1 
join each (
    select 
    device_uuid, 
    session_uuid, 
    nth, 
    sum(cast([project_id].[table_id].attributes.Value as integer)) as Diamonds_Close 
    from [project_id].[table_id] 
    where name = 'App Close' 
    and attributes.Name = 'Inventory - Diamonds' 
    group by device_uuid, session_uuid, nth 
    ) as t2 
on t1.device_uuid = t2.device_uuid 
and t1.session_uuid = t2.session_uuid 

cevap

6

JOIN EACH'un içinde bir GROUP BY var. GROUP BY, kardinalite (farklı değerlerin sayısı) ile sınırları vurgular ve son gruplama paralelleştirilemez. Bu BigQuery'nin birleştirme işlemini yapabilme yeteneğini sınırlar.

GROUP BY değerini GROUP EACH BY olarak değiştirirseniz, bu büyük olasılıkla işe yarayacaktır.

(evet, bu hoş olmayan ve standart dışı olduğunun farkında. BigQuery ekibi şu anda bu 'sadece iş' gibi şeyler yapmaya çalışıyor.)

3

Bu tek sorguya birleştirilebilir:

SELECT device_uuid, 
     session_uuid, 
     nth, 
     SUM(IF (name = 'App Launch', INTEGER([project_id].[table_id].attributes.Value), 0)) AS Diamonds_Launch, 
     SUM(IF (name = 'App Close', INTEGER([project_id].[table_id].attributes.Value), 0)) AS Diamonds_Close, 
FROM [project_id].[table_id] 
WHERE attributes.Name = 'Inventory - Diamonds' 
GROUP BY device_uuid, 
     session_uuid, 
     nth 

Ayrıca büyük tablolar için GRUP HER kullanmak zorunda.

+1

Teşekkür Pentium10, ben bir yolu olması gerektiğini düşündük Bunu bir SELECT ifadesiyle yapın ama anlayamadım. – Davidjb