Campionamento tabella

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 includi una clausola TABLESAMPLE, quindi la query potrebbe restituire risultati diversi ogni nel tempo.

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

Il prossimo esempio 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 tabelle più piccole, se unisci due esempi 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 successivo 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. TABLESAMPLE funziona selezionando in modo casuale una percentuale di blocchi di dati dalla tabella e leggendo tutte le righe nei 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 possono essere costituite da un singolo un blocco 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 delle tabelle restituisce sempre alcuni risultati.

I blocchi possono avere dimensioni diverse, quindi la frazione esatta di righe campionate può variare. Se vuoi campionare singole righe anziché blocchi di dati, puoi utilizzare una clausola WHERE rand() < K. Tuttavia, questo approccio richiede BigQuery per scansionare 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 dallo spazio di archiviazione e poi seleziona in modo casuale il 10% delle righe presenti nei 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 un raccolta di file. BigQuery campiona un sottoinsieme dei carichi di lavoro esterni a cui fa riferimento la tabella. Per alcuni formati file, BigQuery puoi suddividere 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 la scrittura

Se utilizzi il campionamento della tabella con inserimenti di flussi di dati, BigQuery campiona i dati dallo spazio di archiviazione ottimizzato per la scrittura. In alcuni casi, tutti i dati nello spazio di archiviazione ottimizzato 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

Il partizionamento e il clustering producono blocchi in cui tutte le righe all'interno di un intervallo specifico hanno la stessa chiave di partizionamento o hanno attributi di clustering con di chiusura. Di conseguenza, gli insiemi di campioni di queste tabelle tendono a essere più faziosi rispetto a set di esempio da tabelle non partizionate e non in cluster.

Limitazioni

  • Una tabella campionata può essere visualizzata solo una volta in un'istruzione di query. Questa restrizione include le tabelle a cui viene fatto riferimento nelle definizioni delle viste.
  • Il campionamento dei dati delle viste non è supportato.
  • Il campionamento dei risultati di sottoquery o chiamate di funzioni con valore di tabella 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 memorizzare nella cache i risultati di una query che include una clausola TABLESAMPLE. Di conseguenza, comporta il costo della lettura dei dati dallo spazio di archiviazione.