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 alla scansione 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 di una tabella. Inoltre, BigQuery non memorizza nella cache i risultati delle query che includono una clausola TABLESAMPLE, perciò la query potrebbe restituire ogni volta risultati diversi.

Puoi combinare la clausola TABLESAMPLE con altre condizioni di selezione. L'esempio seguente campiona 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 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 ricerca. 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 nei blocchi selezionati. La granularità del campionamento è limitata dal numero di blocchi di dati.

In genere, BigQuery suddivide le tabelle o le partizioni delle tabelle in blocchi se sono di dimensioni superiori a circa 1 GB. Le tabelle più piccole possono essere costituite da un solo 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 della tabella restituisce sempre alcuni risultati.

Poiché i blocchi possono avere dimensioni diverse, 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 a BigQuery di analizzare l'intera tabella. Per risparmiare sui costi senza rinunciare al 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 campiona un sottoinsieme dei file esterni a cui fa riferimento la tabella. Per alcuni formati file, BigQuery può suddividere i singoli file in blocchi per il campionamento. Alcuni dati esterni, come i dati di 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 delle tabelle con gli 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 oppure nessuno.

Tabelle partizionate e in cluster

Il partizionamento e il clustering producono blocchi in cui tutte le righe all'interno di un blocco specifico hanno la stessa chiave di partizionamento o attributi di clustering con valori di chiusura. Pertanto, gli insiemi di campioni di queste tabelle tendono a essere più differenziati rispetto agli insiemi di campioni di tabelle non partizionate e non cluster.

Limitazioni

  • Una tabella campionata può apparire 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 dalle viste non è supportato.
  • Il campionamento dei risultati delle sottoquery o delle chiamate di funzioni con valori di tabella non è supportato.
  • Il campionamento all'interno di una sottoquery IN non è supportato.
  • Il campionamento dalle tabelle con la sicurezza a livello di riga applicata non è supportato.

Prezzi del campionamento delle tabelle

Se utilizzi la fatturazione on demand, ti viene addebitata la lettura dei dati campionati. BigQuery non memorizza nella cache i risultati di una query che include una clausola TABLESAMPLE, quindi ogni esecuzione è soggetta al costo di lettura dei dati dallo spazio di archiviazione.