Come posso assegnare chiavi surrogate quando si inseriscono record in una tabella BigQuery? Qualcosa come usare Sequence per generare valori unici o NextVal?Come posso generare valori chiave univoci per i record in una tabella BigQuery?
risposta
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.
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. –
(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.
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
Questo è abbastanza ampio, poiché ci sono molti modi per farlo. Non c'è nulla di automatico in BQ, quindi devi codificare qualcosa tu stesso per generare quel valore unico. – Patrice