2012-11-20 17 views
6

Ich weiß, dass die Join-Funktion auf BigQuery verbessert wird, um hier nicht zu schimpfen, aber es wird schwierig sein, Terabyte-Datensätze als "angekündigt" zu analysieren, wenn Joins nicht richtig verwendet werden können .Joins auf Google Bigquery

OK, zurück zum Problem, ich habe zwei Tabellen, eine ist 600 Megs und die andere ist 50Megs, ich habe versucht, einen Beitritt zu machen, und ich habe einen Fehler über kleinere Tabelle muss verlassen werden. Ich habe etwas recherchiert und herausgefunden, dass Bigquery beide Tabellen als groß ansieht, wenn sie größer als 7MB sind?

Also basierend auf einigen Ratschlägen, die ich online gefunden habe ich den Datensatz in Frage der kleineren Tabelle ausgewählt und in einer neuen Tabelle gespeichert, der neue Datensatz ist 12MB und 600K Zeilen über zwei Spalten. Dann habe ich versucht, meine Frage wieder, aber ich bin immer noch die gleichen Fehler:

Query Failed : Error: Large table cdrs_test.geoIP_Left must appear as the leftmost table in a join query 

geoIP_Left 12 Megs, die andere Tabelle 600Megs ist ..

Kann man das irgendwie fixiert werden, oder bin ich kaputt? Wenn ja, weiß jemand über andere Dienste, die ich verwenden kann, um große Datenmengen zu analysieren, die Joins unterstützen.

EDIT: Dies ist die eigentliche Abfrage;

SELECT COUNT(results.cc_card) AS count, 
     sum(results.sessiontime) AS time, 
     geoIP_Left.place AS place 
FROM cdrs_test.cdrs_2010_5 AS results 
JOIN cdrs_test.geoIP_Left AS geoIP_table 
    ON results.cc_card = geoIP_table.vcard 
WHERE results.sessiontime > 0 AND results.countryName Contains 'India' 
GROUP BY place; 
+1

Konnten Sie Ihre tatsächliche Frage zeigen? –

+0

Sicher ... hier gehen Sie – user1838066

+0

SELECT COUNT (results.cc_card) AS count, Summe (results.sessiontime) AS Zeit, geoIP_Left.place AS Ort FROM cdrs_test.cdrs_2010_5 AS Ergebnisse JOIN cdrs_test.geoIP_Left AS geoIP_table ON results.cc_card = geoIP_table .vcard WHERE results.sessiontime> 0 UND results.countryName Enthält 'India' GROUP BY place; – user1838066

Antwort

10

Sie könnten diese Abfrage als subselect Ausdruck bringen, dass nur die Spalten von cdrs_test.geoIP_Left verweist, die Sie interessieren. Sehen Sie das zweite Beispiel here.

SELECT 
    COUNT(results.cc_card) AS count, 
    sum(results.sessiontime) AS time, 
    geoIP_table.place AS place 
FROM 
    cdrs_test.cdrs_2010_5 AS results 
JOIN 
    (SELECT place, vcard FROM cdrs_test.geoIP_Left) 
AS 
    geoIP_table 
ON 
    results.cc_card = geoIP_table.vcard 
WHERE 
    results.sessiontime > 0 AND results.countryName CONTAINS 'India' 
GROUP BY 
    place; 

Sie können auch einfach mehrere Abfragen ausführen - beachten Sie, dass die Abfrageergebnisse explizit als benannte Tabelle speichern können, und verwenden Sie diese Tabelle in einer späteren Abfrage. Eine weitere Option wäre die vorherige Verknüpfung der Daten mit (z. B.) einer MapReduce-Transformationspipeline oder einer, die von einem der BigQuery-ETL-Partner bereitgestellt wird.

+1

Update 2013: Sie können jetzt JOINs in 2 großen Tabellen haben, mit JOIN EACH. –

5

Wie von Felipe im Kommentar erwähnt. BigQuery hat einen Modifikator "EACH" für JOIN erlaubt, um JOINs von 2 großen Tabellen zuzulassen. Von der Query-Referenzseite -

Für normale JOIN-Vorgänge muss die rechte Tabelle weniger als 8 MB komprimierte Daten enthalten. Der EACH-Modifizierer ist ein Hinweis, der die Abfrageausführungs-Engine darüber informiert, dass der JOIN möglicherweise auf zwei große Tabellen verweist. Der EACH-Modifikator kann nicht in CROSS JOIN-Klauseln verwendet werden.

Wenn möglich, verwenden Sie JOIN ohne den Modifikator EACH für die beste Leistung. Verwenden Sie JOIN EACH, wenn die Tabellengröße zu groß für JOIN ist.