Campionamento delle tabelle

Il campionamento delle tabelle consente di eseguire query su sottoinsiemi casuali di dati da grandi tabelle BigQuery. Il campionamento restituisce una varietà di record evitando i costi associati all'analisi e all'elaborazione di un'intera tabella.

Utilizzo del campionamento delle tabelle

Per utilizzare il campionamento delle tabelle in una query, includi la clausola TABLESAMPLE. Ad esempio, la seguente query seleziona circa il 10% dei dati di una tabella:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (10 PERCENT)

A differenza della clausola LIMIT, TABLESAMPLE restituisce un sottoinsieme casuale di dati da una tabella. Inoltre, BigQuery non memorizza nella cache i risultati delle query che includono una clausola TABLESAMPLE, pertanto la query potrebbe restituire risultati diversi ogni volta.

Puoi combinare la clausola TABLESAMPLE con altre condizioni di selezione. Il seguente esempio esegue il campionamento di circa il 50% della tabella e poi applica una clausola WHERE:

SELECT *
FROM dataset.my_table TABLESAMPLE SYSTEM (50 PERCENT)
WHERE customer_id = 1

L'esempio seguente combina una clausola TABLESAMPLE con una clausola JOIN:

SELECT *
FROM dataset.table1 T1 TABLESAMPLE SYSTEM (10 PERCENT)
JOIN dataset.table2 T2 TABLESAMPLE SYSTEM (20 PERCENT) USING (customer_id)

Per le tabelle più piccole, se unisci due campioni e nessuna delle righe campionate soddisfa la condizione di join, potresti ricevere un risultato vuoto.

Puoi specificare la percentuale come parametro di query. L'esempio seguente mostra come passare la percentuale a una query utilizzando lo strumento a riga di comando bq:

bq query --use_legacy_sql=false --parameter=percent:INT64:29 \
    'SELECT * FROM `dataset.my_table` TABLESAMPLE SYSTEM (@percent PERCENT)`

Le tabelle BigQuery sono organizzate in blocchi di dati. La clausola TABLESAMPLE funziona selezionando in modo casuale una percentuale di blocchi di dati dalla tabella e leggendo tutte le righe dei blocchi selezionati. La granularità del campionamento è limitata dal numero di blocchi di dati.

In genere, BigQuery suddivide le tabelle o le partizioni di tabelle in blocchi se sono più grandi di circa 1 GB. Le tabelle più piccole potrebbero essere costituite da un singolo blocco di dati. In questo caso, la clausola TABLESAMPLE legge l'intera tabella. Se la percentuale di campionamento è maggiore di zero e la tabella non è vuota, il campionamento della tabella restituisce sempre alcuni risultati.

I blocchi possono avere dimensioni diverse, pertanto la frazione esatta di righe campionate potrebbe variare. Se vuoi campionare singole righe anziché blocchi di dati, puoi utilizzare una clausola WHERE rand() < K. Tuttavia, questo approccio richiede che BigQuery esamini l'intera tabella. Per risparmiare sui costi, ma comunque beneficiare del campionamento a livello di riga, puoi combinare entrambe le tecniche.

L'esempio seguente legge circa il 20% dei blocchi di dati dall'archiviazione e seleziona in modo casuale il 10% delle righe in questi blocchi:

SELECT * FROM dataset.my_table TABLESAMPLE SYSTEM (20 PERCENT)
WHERE rand() < 0.1

Tabelle esterne

Puoi utilizzare la clausola TABLESAMPLE con tabelle esterne che archiviano i dati in una raccolta di file. BigQuery esegue il campionamento di un sottoinsieme dei file esterni a cui fa riferimento la tabella. Per alcuni formati di file, BigQuery può suddividere i singoli file in blocchi per il campionamento. Alcuni dati esterni, ad esempio quelli in Fogli Google, sono costituiti da un singolo file campionato come un blocco di dati.

Campionamento dallo spazio di archiviazione ottimizzato per le scritture

Se utilizzi il campionamento delle tabelle con insert di streaming, BigQuery esegue il campionamento dei dati dallo spazio di archiviazione ottimizzato per la scrittura. In alcuni casi, tutti i dati nell'archiviazione ottimizzata per la scrittura sono rappresentati come un unico blocco. In questo caso, o vengono visualizzati tutti i dati nello spazio di archiviazione ottimizzato per la scrittura nei risultati o non viene visualizzato nessuno.

Tabelle partizionate e in cluster

La partizione e il clustering producono blocchi in cui tutte le righe all'interno di un blocco specifico hanno la stessa chiave di partizione o attributi di clustering con valori simili. Pertanto, i set di campioni di queste tabelle tendono ad essere più sbilanciati rispetto ai set di campioni di tabelle non partizionate e non raggruppate.

Limitazioni

  • Una tabella campionata può essere visualizzata una sola volta in un'istruzione di query. Questa limitazione include le tabelle a cui viene fatto riferimento all'interno delle definizioni delle viste.
  • Il campionamento dei dati dalle visualizzazioni non è supportato.
  • Il campionamento dei risultati di sottoquery o chiamate di funzioni con valore di tabella non è supportato.
  • Il campionamento da una scansione di array, ad esempio il risultato della chiamata dell'operatore UNNEST, non è supportato.
  • Il campionamento all'interno di una sottoquery IN non è supportato.
  • Il campionamento da tabelle con sicurezza a livello di riga applicata non è supportato.

Prezzi del campionamento delle tabelle

Se utilizzi la fatturazione on demand, ti verrà addebitato il costo per la lettura dei dati campionati. BigQuery non memorizza nella cache i risultati di una query che include una clausola TABLESAMPLE, pertanto ogni esecuzione comporta il costo della lettura dei dati dall'archiviazione.