2012-11-20 14 views
6

So che si sta lavorando per migliorare la funzione di Join su Bigquery, non per irritare qui, ma sarà difficile analizzare set di dati 'Terabyte' come 'pubblicizzati' se Joins non può essere usato correttamente .Join su Google Bigquery

OK, torna al problema, ho due tavoli uno è di 600 Meg e l'altro è di 50Meg, ho provato a fare un join e ho ricevuto un errore sulla tabella più piccola deve essere lasciato. Ho fatto qualche ricerca e ho scoperto che Bigquery considera entrambe le tabelle grandi se sono superiori a 7 MB?

Quindi, in base a qualche consiglio che ho trovato online, ho selezionato il set di dati in questione della tabella più piccola e l'ho salvato in una nuova tabella, il nuovo set di dati è 12MB e 600K righe su due colonne. Poi ho provato di nuovo la mia domanda, ma ancora sto ottenendo lo stesso errore:

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

geoIP_Left è di 12 mega, l'altra tabella è 600Megs ..

questo può essere risolto in un modo o sto sballato? Se è così, qualcuno sa di qualsiasi altro servizio che posso utilizzare per analizzare grandi serie di dati che supportano i join?

MODIFICA: Questa è la query effettiva;

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

Potresti mostrare la tua domanda reale? –

+0

Sicuro ..qui vai – user1838066

+0

SELECT COUNT (results.cc_card) AS count, sum (results.sessiontime) AS time, geoIP_Left.place AS place FROM cdrs_test.cdrs_2010_5 AS risultati JOIN cdrs_test.geoIP_Left AS geoIP_table ON results.cc_card = geoIP_table .vcard WHERE results.sessiontime> 0 AND results.countryName Contiene il luogo GROUP BY "India"; – user1838066

risposta

10

Si potrebbe esprimere questa query come una selezione secondaria che fa riferimento solo le colonne da cdrs_test.geoIP_Left che interessa. Vedere il secondo esempio 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; 

Si può anche semplicemente eseguire più query - si noti che è possibile salvare i risultati delle query in modo esplicito come una tabella denominata, e l'uso che tavolo in una query in seguito.

Infine, un'altra opzione sarebbe quella di pre-unire i dati, utilizzando (ad esempio) una pipeline di trasformazione MapReduce o uno ETL tool fornito da uno dei partner ETL di BigQuery.

+1

2013: ora puoi avere JOINs in 2 grandi tavoli, usando JOIN EACH. –

5

Come menzionato da Felipe nel commento. BigQuery ha permesso a un modificatore "EACH" di partecipare per consentire JOINs di 2 grandi tavoli. Dalla pagina Riferimento query -

Le normali operazioni JOIN richiedono che la tabella di destra contenga meno di 8 MB di dati compressi. Il modificatore EACH è un suggerimento che informa il motore di esecuzione della query che il JOIN potrebbe fare riferimento a due tabelle di grandi dimensioni. Il modificatore EACH non può essere utilizzato nelle clausole CROSS JOIN.

Se possibile, utilizzare JOIN senza il modificatore EACH per prestazioni ottimali. Usa UNISCITI OGNI quando le dimensioni della tabella sono troppo grandi per JOIN.