2013-05-16 9 views
12

Ich versuche, eine Abfrage zu führen, die 2 große Sätze von Daten verbindet, und ich treffe die Ressourcen überschritten während der Abfrage Ausführungsfehler. Ich habe gelesen, dass es Arbeit gibt, wenn Sie Join Each und Group Each verwenden, aber nicht, was diese Workaround wäre.Ressourcen überschritten während Abfrageausführung

SELECT 
    year(users.firstseen) as first_year, 
    month(users.firstseen) as first_month, 
    DATEDIFF(orders.timestamp,users.firstseen) as days_elapsed, 
    count(orders.user_key) as count_orders 
FROM 
    [project.orders] as orders 
JOIN EACH 
    [project.users] AS users 
ON 
    orders.user_key = users.user_key 
WHERE orders.store = 'ios' 
GROUP EACH BY 1,2,3 

Edit: das bearbeitete folgende:

SELECT 
    year(users.firstseen) as firstyear, 
    month(users.firstseen) as firstmonth, 
    DATEDIFF(orders.timestamp, users.firstseen) as days_elapsed, 
    COUNT(users.firstseen) AS count_orders FROM [project.orders] as orders 
JOIN EACH(SELECT user_key, firstseen FROM [project.users] 
WHERE store_key = 'ios') as users ON orders.user_key = users.user_key 
GROUP BY firstyear, firstmonth, days_elapsed 
ORDER BY firstyear, firstmonth, days_elapsed 
+1

dies endete Arbeits SELECT Jahr (users.firstseen) als firstyear, Monat (users.firstseen) als firstmonth, DATEDIFF (orders.timestamp, users.firstseen) als days_elapsed, COUNT (users.firstseen) AS count_orders FROM [project.orders] als Aufträge each ( SELECT user_key VERBINDEN VON firstseen [project.users] WHERE store_key = 'ios') als Benutzer ON orders.user_key = users.user_key GROUP BY firstear, firstmonth, days_elapsed ORDER BY firstear, firstmonth, days_elapsed – user2388120

Antwort

12

EACH JOIN kann fehlschlagen, wenn Sie Ihre Schlüssel kommen (in diesem Fall user_key) sind ungleich verteilt. Wenn beispielsweise ein Benutzerschlüssel ungewöhnlich oft angezeigt wird, erhalten Sie vom Knoten, der diesen Schlüssel verarbeitet, den Fehler "Ressourcen überschritten". Alternativ können Sie versuchen, die Abfrage über einen kleineren Satz von Benutzerschlüsseln auszuführen, indem Sie einen Teil der Benutzerschlüssel vor dem Join ausfiltern.

Gruppe EACH BY kann fehlschlagen, wenn Sie zu viele verschiedene Gruppenschlüssel haben. Sie könnten versuchen, die Join-Ausgabe zu verkleinern, indem Sie einige weitere WHERE-Klauseln hinzufügen, um zu sehen, ob dies der Fall ist.

Grundsätzlich würde ich empfehlen, die Eingaben entweder auf JOIN EACH oder GROUP EACH BY zu reduzieren, bis die Abfrage funktioniert, und dann haben Sie ein besseres Gespür für die Limits, mit denen Sie konfrontiert werden . Sobald Sie das wissen, können Sie (hoffentlich) Ihre Abfragen strukturieren, um die verfügbaren Ressourcen optimal zu nutzen.

(BTW, wir erwarten, dass diese Operationen in der nahen Zukunft abzustimmen einige der Grenzen entfernen Sie schlagen können!)

+0

Es sieht so aus, als ob ein JOIN EACH, der 0 Treffer liefert, auch diesen Fehler auslöst (getestet bei einem Beitritt 2 Millionen übrig, 180 Millionen rechts). – moin

+0

Ein JOIN EACH mit null Übereinstimmungen ist wahrscheinlich nicht der einzige Schuldige. Wahrscheinlicher ist, dass eine andere Klausel in Ihrer Abfrage vor oder nach dem JOIN EACH vorhanden ist, die die für einen bestimmten Worker-Knoten verfügbaren Ressourcen überschreitet. Wenn Sie eine Job-ID an [email protected] senden, kann ich etwas genauer hinsehen. –

+0

@ JeremyCondit Haben Sie ein Update zu den Einschränkungen? –

Verwandte Themen