Campionamento tabella

Il campionamento delle tabelle consente di eseguire query su sottoinsiemi casuali di dati e tabelle BigQuery. Il campionamento restituisce una serie di record, evitando i costi associati alla scansione e all'elaborazione di un'intera tabella.

Utilizzo del campionamento delle tabelle

Per utilizzare il campionamento tabella in una query, includi il parametro TABLESAMPLE una clausola. Ad esempio, la seguente query seleziona circa il 10% del dati:

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

A differenza della clausola LIMIT, TABLESAMPLE restituisce un sottoinsieme casuale di dati da un 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. La il seguente esempio campiona circa il 50% della tabella e poi applica un valore WHERE clausola:

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. Granularità di campionamento è limitato dal numero di blocchi di dati.

In genere, BigQuery suddivide le tabelle o le partizioni delle tabelle in blocchi se sono superiori a 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 usare invece una clausola WHERE rand() < K. Tuttavia, questo approccio richiede BigQuery per scansionare l'intera tabella. Per risparmiare sui costi, ma trarre vantaggio dal 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 di grandi dimensioni in Fogli Google, è costituita 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 singolo blocco. In questo caso, nei risultati vengono visualizzati tutti i dati nello spazio di archiviazione ottimizzato per la scrittura o nessuno di essi.

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 delle sottoquery o delle chiamate di funzione con valori di tabella non supportati.
  • Il campionamento all'interno di una sottoquery IN non è supportato.
  • Il campionamento dalle tabelle a cui è applicata la sicurezza a livello di riga non è supportato.

Prezzi del campionamento delle tabelle

Se utilizzi la fatturazione on demand, ti vengono addebitati i costi 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.