2015-11-17 7 views

risposta

5

Ecco un approccio che genera un ID unico intero per ogni riga, con gli ID ordinate secondo un valore nella datasaet sorgente, in questo caso un timestamp:

SELECT 
    RANK() OVER(ORDER BY timestamp) unique_id, 
    title 
FROM 
    [publicdata:samples.wikipedia] 
LIMIT 1000 

Un'alternativa consiste nel generare unica identificatori in modo casuale:

SELECT 
    RANK() OVER(ORDER BY random) unique_id, 
    RAND() random, 
    title 
FROM 
    [publicdata:samples.wikipedia] 
LIMIT 1000 

per collegare questi valori al momento dell'inserimento, caricare i dati di origine in una tabella BigQuery, quindi modificare il codice di cui sopra per selezionare da quel tavolo (invece di wikipedia) e salvare i risultati.

+0

Entrambe le query non sono riuscite con Errore: "Risorse superate durante l'esecuzione della query: la query non può essere eseguita nella memoria assegnata L'operatore di ordinamento utilizzato per OVER (ORDER BY) ha utilizzato troppa memoria .." L'operazione ORDER BY è piuttosto costosa e non può essere elaborato in parallelo. Quindi c'erano troppe righe da tenere in memoria su un singolo nodo. –

3

(spiacente, non ancora abbastanza reputazione per aggiungere commenti su risposte esistenti ...)

Quale fonte e il formato stai caricando i dati da? Se si tratta di CSV o JSON di GCS, è possibile associare la soluzione di Michael con le origini dati federate (https://cloud.google.com/bigquery/federated-data-sources) per generare la tabella e gli ID in una singola operazione anziché avere sia un carico sia una query.

3

lo faccio come questo

SELECT 
    (ROW_NUMBER() OVER()) 
    + 
    (
     SELECT 
     MAX(surrogate_key) 
     FROM 
     dimension_table) AS surrogate_key, 
    business_key, 
    attribute1, 
    attributen, 
    CURRENT_DATE AS start_date, 
    null as end_date, 
    true AS is_current 
FROM 
    source_table 
  • nb: ultimi 3 elementi sono campi scd2 e richiede nuove SQL stile sintassi per lavorare

  • NB2: se ORDER BY in ROW_NUMBER, BigQuery probabilmente causerà un errore troppo difficile perché ORDER BY non può essere parallelizzato