2015-02-24 3 views
6

Próbuję uruchomić kwerendę w BigQuery, która ma dwa selekcje podrzędne i sprzężenie, ale nie mogę go uruchomić. Tym, co robię jako obejście, jest samodzielne uruchamianie podselekcji, a następnie zapisywanie ich jako tabel, a następnie wykonywanie innego zapytania z łączeniem, ale myślę, że powinienem być w stanie to zrobić za pomocą jednego zapytania.Google BigQuery prosi o DOŁĄCZ DO KAŻDEGO, ale już go używam.

Dostaję błąd:

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

ale jestem już przy użyciu dołączyć każdy. Próbowałem używać łączenia krzyżowego i używania grupy przez każdą z nich, ale te dają mi różne błędy. Inne pytania dotyczące Stack Overflow na ten temat nie pomagają, jeden mówi, że był to błąd w BigQuery, a drugi to ktoś, kto używa "cross join each" ...

Poniżej znajduje się mój sql, wybacz mi, jeśli jest pełny błędów, ale myślę, że to powinno działać:

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 

Odpowiedz

6

Masz GROUP BY wewnątrz JOIN EACH. GROUP BY zawiera limity z licznością (liczba różnych wartości), a końcowe grupowanie nie jest możliwe do zrównoleglenia. Ogranicza to zdolność BigQuery do łączenia.

Jeśli zmienisz GROUP BY na GROUP EACH BY, najprawdopodobniej to zadziała.

(tak, zdaję sobie sprawę, że jest to nieprzyjemne i niestandardowe. Zespół BigQuery obecnie pracuje ciężko na tworzenie rzeczy jak to „po prostu działa”).

3

ten może być połączony do jednego zapytania:

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 

można również użyć GROUP każdy dla dużych tabelach.

+1

Dzięki Pentium10, myślałem, że nie powinno być sposobem zrób to za pomocą jednej instrukcji SELECT, ale nie mogłem tego rozgryźć. – Davidjb