Gestione delle tabelle partizionate
Questo documento descrive come gestire le tabelle partizionate in BigQuery.
Ottieni metadati di partizione
Puoi ottenere informazioni sulle tabelle partizionate nei seguenti modi:
- Utilizza la visualizzazione
INFORMATION_SCHEMA.PARTITIONS
(Anteprima). - Utilizza la metatabella
__PARTITIONS_SUMMARY__
(solo SQL precedente).
Recupero dei metadati di partizione utilizzando INFORMATION_SCHEMA
viste
Quando esegui una query sulla vista INFORMATION_SCHEMA.PARTITIONS
, i risultati
una riga per ogni partizione. Ad esempio, la seguente query elenca tutti
delle partizioni di tabella nel set di dati denominato mydataset
:
SELECT table_name, partition_id, total_rows
FROM `mydataset.INFORMATION_SCHEMA.PARTITIONS`
WHERE partition_id IS NOT NULL
Per ulteriori informazioni,
consulta INFORMATION_SCHEMA.PARTITIONS
.
Recupero dei metadati di partizione utilizzando le metatabelle
In SQL precedente, puoi ottenere metadati relativi alle partizioni delle tabelle eseguendo una query sul
Metatabella __PARTITIONS_SUMMARY__
. Le metatabelle sono tabelle di sola lettura che
e contengono metadati.
Esegui la query sulla metatabella __PARTITIONS_SUMMARY__
nel seguente modo:
#legacySQL SELECT column FROM [dataset.table$__PARTITIONS_SUMMARY__]
La metatabella __PARTITIONS_SUMMARY__
ha le seguenti colonne:
Valore | Descrizione |
---|---|
project_id |
Nome del progetto. |
dataset_id |
Nome del set di dati. |
table_id |
Nome della tabella partizionata nel tempo. |
partition_id |
Nome (data) della partizione. |
creation_time |
Il momento in cui è stata creata la partizione, in millisecondi dal 1 gennaio 1970 UTC. |
last_modified_time |
Il momento in cui è stata modificata l'ultima partizione, in millisecondi dal 1° gennaio 1970 UTC. |
Come minimo, per eseguire un job di query che utilizza il meta tag __PARTITIONS_SUMMARY__
tabella, devi disporre delle autorizzazioni bigquery.jobs.create
e
Autorizzazioni bigquery.tables.getData
.
Per ulteriori informazioni sui ruoli IAM in BigQuery, consulta Controllo dell'accesso.
Imposta la scadenza della partizione
Quando crei una tabella partizionata per ora di importazione o colonna unità di tempo, puoi specificare una scadenza per la partizione. Questa impostazione specifica per quanto tempo BigQuery conserva i dati in ogni partizione. L'impostazione si applica a tutte le partizioni della tabella, ma viene calcolata in modo indipendente per ogni partizione in base al tempo di partizione.
La scadenza di una partizione viene calcolata in base al limite della partizione in UTC. Ad esempio, con il partizionamento giornaliero, il limite di partizione è a mezzanotte (00:00:00 UTC). Se la scadenza della partizione della tabella è 6 ore, allora ogni scade alle 06:00:00 UTC del giorno successivo. Quando una partizione scade, BigQuery elimina i dati contenuti nella partizione.
Puoi anche specificare scadenza predefinita della partizione a livello del set di dati. Se imposti la scadenza della partizione su una tabella, Il valore sostituisce la scadenza predefinita della partizione. Se non specifichi nessun valore (nella tabella o nel set di dati), le partizioni non scadono mai.
Se imposti una scadenza per la tabella, quel valore ha la precedenza sulla partizione la scadenza del periodo di conservazione. Ad esempio, se la scadenza della tabella è impostata su 5 giorni e la scadenza della partizione è impostata su 7 giorni, quindi la tabella e tutte le partizioni al suo interno vengono eliminati dopo 5 giorni.
Puoi aggiornare la partizione della tabella in qualsiasi momento dopo la creazione la scadenza del periodo di conservazione. La nuova impostazione si applica a tutte le partizioni della tabella, indipendentemente dal momento della loro creazione. Le partizioni esistenti scadono immediatamente se sono sia precedente alla nuova data di scadenza. Analogamente, se i dati vengono copiati inserite in una tabella partizionata per colonna dell'unità di tempo, eventuali partizioni precedenti a la scadenza della partizione configurata per la tabella viene scaduta immediatamente.
Quando una partizione scade, i dati al suo interno non sono più disponibili e non ti viene addebitato alcun costo per l'archiviazione di quella partizione. BigQuery elimina la partizione scaduta. Nel frattempo, il conteggio delle partizioni ai fini quote delle tabelle. Per eliminare una partizione puoi eliminare la partizione manualmente immediatamente.
Aggiorna la scadenza della partizione
Per aggiornare la scadenza della partizione di una tabella partizionata:
Console
Non puoi aggiornare la scadenza della partizione nella console Google Cloud.
SQL
Utilizza la
Dichiarazione ALTER TABLE SET OPTIONS
.
Nell'esempio che segue
aggiorna la scadenza a 5 giorni. Per rimuovere la scadenza della partizione per un
imposta partition_expiration_days
su NULL
.
Nella console Google Cloud, vai alla pagina BigQuery.
Nell'editor query, inserisci la seguente istruzione:
ALTER TABLE mydataset.mytable SET OPTIONS ( -- Sets partition expiration to 5 days partition_expiration_days = 5);
Fai clic su
Esegui.
Per ulteriori informazioni su come eseguire le query, consulta Eseguire una query interattiva.
bq
Esegui il comando bq update
con --time_partitioning_expiration
flag. Se stai aggiornando una tabella partizionata in un progetto diverso dal tuo
predefinito, aggiungi l'ID progetto al nome del set di dati nel seguente
formato: project_id:dataset
.
bq update \ --time_partitioning_expiration integer_in_seconds \ --time_partitioning_type unit_time \ project_id:dataset.table
Dove:
- integer è la durata predefinita (in secondi) per l'intervallo di date
partizioni di Compute Engine. Non c'è un valore minimo. La scadenza corrisponde a
la data della partizione più il valore intero. Se specifichi
0
, la scadenza della partizione viene rimossa senza scadenza. Le partizioni senza scadenza devono essere eliminate manualmente. - unit_time è
DAY
,HOUR
,MONTH
oYEAR
, in base alla granularità di partizionamento della tabella. Questo valore deve corrispondere alla che hai impostato quando hai creato la tabella. - project_id è l'ID progetto.
- dataset è il nome del set di dati che contiene la tabella che stai aggiornando.
- table è il nome della tabella che stai aggiornando.
Esempi:
Inserisci il comando seguente per aggiornare la scadenza delle partizioni in
mydataset.mytable
a 5 giorni (432.000 secondi). mydataset
è in
progetto predefinito.
bq update --time_partitioning_expiration 432000 mydataset.mytable
Inserisci il comando seguente per aggiornare la scadenza delle partizioni in
mydataset.mytable
a 5 giorni (432.000 secondi). mydataset
partecipa
myotherproject
, non il progetto predefinito.
bq update \
--time_partitioning_expiration 432000 \
myotherproject:mydataset.mytable
API
Chiama il tables.patch
e utilizza la proprietà timePartitioning.expirationMs
per aggiornare
la scadenza della partizione in millisecondi. Poiché il metodo tables.update
sostituisce l'intera risorsa della tabella, è preferibile il metodo tables.patch
.
Imposta i requisiti del filtro di partizionamento
Quando crei una tabella partizionata, puoi richiedere che tutte le query
deve includere un filtro dei predicati (una clausola WHERE
) che filtra in base alla
di partizionamento orizzontale. Questa impostazione può migliorare le prestazioni
e ridurre i costi,
perché BigQuery può usare il filtro per eliminare le partizioni
non corrispondono al predicato.
Per informazioni sull'aggiunta dell'opzione Richiedi filtro di partizionamento quando una tabella partizionata, consulta Creazione di tabelle partizionate.
Se una tabella partizionata ha l'impostazione Richiedi filtro di partizionamento, ogni la query in quella tabella deve includere almeno un predicato che faccia riferimento solo di partizionamento orizzontale. Le query senza questo predicato restituiscono quanto segue errore:
Cannot query over table 'project_id.dataset.table' without a
filter that can be used for partition elimination
.
Per ulteriori informazioni, vedi Esecuzione di query su tabelle partizionate.
Aggiorna il requisito del filtro di partizionamento
Se non abiliti l'opzione Richiedi filtro di partizione quando crei il tabella partizionata, puoi aggiornarla per aggiungere l'opzione.
Console
Non puoi utilizzare la console Google Cloud per richiedere filtri di partizione dopo viene creata una tabella partizionata.
SQL
Utilizza la
Dichiarazione ALTER TABLE SET OPTIONS
per aggiornare il requisito del filtro di partizionamento. Le seguenti
esempio aggiorna il requisito a true
:
Nella console Google Cloud, vai alla pagina BigQuery.
Nell'editor query, inserisci la seguente istruzione:
ALTER TABLE mydataset.mypartitionedtable SET OPTIONS ( require_partition_filter = true);
Fai clic su
Esegui.
Per ulteriori informazioni su come eseguire le query, consulta Eseguire una query interattiva.
bq
Per aggiornare una tabella partizionata in modo che richieda i filtri di partizione utilizzando lo strumento a riga di comando bq,
inserisci il comando bq update
e fornisci il valore --require_partition_filter
flag.
Per aggiornare una tabella partizionata in un progetto diverso da quello predefinito, aggiungi l'ID progetto al set di dati nel seguente formato: project_id:dataset.
Ad esempio:
Per aggiornare mypartitionedtable
in mydataset
nel progetto predefinito,
inserisci:
bq update --require_partition_filter mydataset.mytable
Per aggiornare mypartitionedtable
in mydataset
in myotherproject
,
inserisci:
bq update --require_partition_filter myotherproject:mydataset.mytable
API
Chiama il tables.patch
e imposta la proprietà requirePartitionFilter
su true
per richiedere
i filtri di partizione. Poiché il metodo tables.update
sostituisce l'intero
di risorsa tabella, è preferibile il metodo tables.patch
.
Java
Prima di provare questo esempio, segui le istruzioni per la configurazione di Java nel Guida rapida di BigQuery con librerie client. Per ulteriori informazioni, consulta API Java BigQuery documentazione di riferimento.
Per eseguire l'autenticazione su BigQuery, configura Credenziali predefinite dell'applicazione. Per ulteriori informazioni, vedi Configura l'autenticazione per le librerie client.
Copia una tabella partizionata
La procedura per copiare una tabella partizionata è la stessa utilizzata per copiando una tabella standard. Per ulteriori informazioni, vedi Copia di una tabella.
Quando copi una tabella partizionata, tieni presente quanto segue:
- Copia di una tabella partizionata in una nuova tabella di destinazione
- Tutte le informazioni di partizionamento vengono copiate con la tabella. Il nuovo e quella precedente avranno partizioni identiche.
- Copia di una tabella non partizionata in una tabella partizionata esistente
- Questa operazione è supportata solo per il partizionamento in fase di importazione. BigQuery copia i dati di origine nella partizione rappresenta la data corrente. Questa operazione non è supportata per l'unità di tempo partizionate per colonne o con intervallo di numeri interi.
- Copia di una tabella partizionata in un'altra tabella partizionata
- Le specifiche della partizione per le tabelle di origine e di destinazione devono .
- Copia di una tabella partizionata in una tabella non partizionata
- La tabella di destinazione rimane non partizionata.
- Copia di più tabelle partizionate
Se copi più tabelle di origine in una tabella partizionata nello stesso le tabelle di origine non possono contenere un insieme di componenti non partizionate.
Se tutte le tabelle di origine sono partizionate, la partizione specifiche per tutte le tabelle di origine devono corrispondere a quelle della tabella di destinazione le specifiche della partizione di controllo.
Quando copi in una tabella esistente, puoi specificare se aggiungere o sovrascrivere la tabella di destinazione.
Copia singole partizioni
Puoi copiare i dati da una o più partizioni in un'altra tabella.
Console
La copia delle partizioni non è supportata dalla console Google Cloud.
bq
Per copiare una partizione, usa bq cp
dello strumento a riga di comando bq (copia)
con un decoratore di partizione ($date
), come
$20160201
.
È possibile usare i flag facoltativi per controllare l'istruzione di scrittura partizione di destinazione:
-a
o--append_table
aggiunge i dati dalla partizione di origine a un una tabella o una partizione esistente nel set di dati di destinazione.-f
o--force
sovrascrive una tabella o una partizione esistente in del set di dati di destinazione e non richiede conferma.-n
o--no_clobber
restituisce il seguente messaggio di errore se la tabella o nel set di dati di destinazione:Table '<var>project_id:dataset.table</var> or <var>table$date</var>' already exists, skipping.
Se-n
non viene specificato, il comportamento predefinito è chiederti di scegliere se sostituire la tabella di destinazione della partizione di testo.--destination_kms_key
è la chiave Cloud KMS gestita dal cliente utilizzata per criptare la tabella o la partizione di destinazione.
Il comando cp
non supporta --time_partitioning_field
o
--time_partitioning_type
flag. Non puoi utilizzare un job di copia per convertire un
tabella partizionata per data di importazione in una tabella partizionata.
--destination_kms_key
non è stata dimostrata qui. Consulta:
Protezione dei dati con le chiavi Cloud KMS
per ulteriori informazioni.
Se il set di dati di origine o di destinazione si trova in un progetto diverso da quello predefinito
aggiungi l'ID progetto ai nomi del set di dati nel seguente formato:
project_id:dataset
.
(Facoltativo) Fornisci il flag --location
e imposta il valore su
località.
bq --location=location cp \ -a -f -n \ project_id:dataset.source_table$source_partition \ project_id:dataset.destination_table$destination_partition
Dove:
- location è il nome della tua sede. Il flag
--location
è facoltativo. Ad esempio, se utilizzi BigQuery Regione di Tokyo, puoi impostare il valore del flag suasia-northeast1
. Puoi imposta un valore predefinito per la località utilizzando file.bigqueryrc. - project_id è l'ID progetto.
- dataset è il nome del set di dati di origine o di destinazione.
- source_table è la tabella che stai copiando.
- source_partition è il decoratore della partizione dell'origine della partizione di testo.
- destination_table è il nome della tabella nella destinazione del set di dati.
- destination_partition è il decoratore della partizione partizione di destinazione.
Esempi:
Copia di una partizione in una nuova tabella
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
a una nuova tabella: mydataset.mytable2
. mydataset
è incluso nel progetto predefinito.
bq cp -a 'mydataset.mytable$20180130' mydataset.mytable2
Copia di una partizione in una tabella non partizionata
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
a una tabella non partizionata:
mydataset2.mytable2
. La scorciatoia -a
viene utilizzata per aggiungere alla partizione
alla tabella di destinazione non partizionata. Entrambi i set di dati si trovano
progetto predefinito.
bq cp -a 'mydataset.mytable$20180130' mydataset2.mytable2
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
a una tabella non partizionata:
mydataset2.mytable2
. La scorciatoia -f
viene utilizzata per sovrascrivere
una tabella di destinazione non partizionata senza richieste di conferma.
bq --location=US cp -f 'mydataset.mytable$20180130' mydataset2.mytable2
Copia di una partizione in un'altra tabella partizionata
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
a un'altra tabella partizionata:
mydataset2.mytable2
. La scorciatoia -a
viene utilizzata per aggiungere alla partizione
i dati nella tabella di destinazione. Poiché non è specificato alcun decoratore della partizione
tabella di destinazione, la chiave di partizione di origine viene conservata e i dati vengono
copiato nella partizione del 30 gennaio 2018 nella tabella di destinazione. Puoi
specificare anche un decorator della partizione nella tabella di destinazione in cui copiare i dati
una partizione specifica. mydataset
è nel tuo progetto predefinito. mydataset2
si trova in myotherproject
, non nel tuo progetto predefinito.
bq --location=US cp \
-a \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
alla partizione del 20 febbraio 2018 di un'altra
tabella partizionata: mydataset2.mytable2
. Viene usata la scorciatoia -f
per sovrascrivere la partizione del 20 febbraio 2018 nella tabella di destinazione
senza chiedere conferma. Se non viene utilizzato alcun decoratore della partizione, tutti i dati nel
viene sovrascritta. mydataset
è nel tuo progetto predefinito.
mydataset2
si trova nella cartella myotherproject
, non nel tuo progetto predefinito.
bq cp \
-f \
'mydataset.mytable$20180130' \
'myotherproject:mydataset2.mytable2$20180220'
Inserisci il comando seguente per copiare la partizione del 30 gennaio 2018 da
mydataset.mytable
a un'altra tabella partizionata:
mydataset2.mytable2
. mydataset
è nel tuo progetto predefinito. mydataset2
si trova in myotherproject
, non nel tuo progetto predefinito. Se esistono dati nella
di destinazione, il comportamento predefinito prevede la richiesta di sovrascrittura.
bq cp \
'mydataset.mytable$20180130' \
myotherproject:mydataset2.mytable2
Per copiare più partizioni, specificale come elenco separato da virgole:
bq cp \ 'mydataset.mytable$20180130,mydataset.mytable$20180131' \ myotherproject:mydataset.mytable2
API
Chiama il jobs.insert
e configurare un job copy
. (Facoltativo) Specifica la tua regione nel
Proprietà location
nella sezione jobReference
di
risorse di lavoro.
Specifica le seguenti proprietà nella configurazione del job:
- Inserisci il set di dati, la tabella e la partizione di origine nel campo
sourceTables
proprietà. - Inserisci il set di dati e la tabella di destinazione nel campo
destinationTable
proprietà. - Utilizza la proprietà
writeDisposition
per specificare se aggiungere o sovrascrivere la tabella o la partizione di destinazione.
Per copiare più partizioni, inserisci le partizioni di origine (incluso il
nomi di set di dati e tabelle) nella proprietà sourceTables
.
Elimina una partizione
Puoi eliminare una singola partizione da una tabella partizionata. Tuttavia,
non può eliminare le partizioni speciali __NULL__
o __UNPARTITIONED__
.
Puoi solo a eliminare una partizione alla volta.
Puoi eliminare una partizione specificando il decorator della partizione, a meno che non uno dei due partizioni speciali.
Per eliminare una partizione in una tabella partizionata:
Console
L'eliminazione delle partizioni non è supportata dalla console Google Cloud.
SQL
Se
dichiarazione DELETE
idonea
copre tutte le righe di una partizione,
BigQuery rimuove l'intera partizione. La rimozione è stata completata
senza scansionare byte o consumare slot. Il seguente esempio di
L'istruzione DELETE
copre l'intera partizione di un filtro nell'area
_PARTITIONDATE
pseudocolonna:
Nella console Google Cloud, vai alla pagina BigQuery.
Nell'editor query, inserisci la seguente istruzione:
DELETE mydataset.mytable WHERE _PARTITIONDATE IN ('2076-10-07', '2076-03-06');
Fai clic su
Esegui.
Per ulteriori informazioni su come eseguire le query, consulta Eseguire una query interattiva.
bq
Usa il comando bq rm
con il flag --table
(o la scorciatoia -t
) e
specificare il decorator della partizione
per eliminare una partizione specifica.
bq rm --table project_id:dataset.table$partition
Dove:
- project_id è l'ID progetto. Se omesso, il progetto predefinito .
- dataset è il nome del set di dati che contiene la tabella.
- table è il nome della tabella.
- partition è il decoratore della partizione che stai l'eliminazione.
I decoratori delle partizioni hanno il seguente formato, a seconda del tipo di partizionamento:
- Partizione oraria:
yyyymmddhh
. Esempio:$2016030100
. - Partizione giornaliera:
yyyymmdd
. Esempio:$20160301
. - Partizione mensile:
yyyymm
. Esempio:$201603
. - Partizione annuale:
yyyy
. Esempio:$2016
. - Partizione intervallo intero: inizio dell'intervallo di partizione. Esempio:
$20
.
Lo strumento a riga di comando bq ti chiede di confermare l'azione. Per saltare la conferma:
usa il flag --force
(o la scorciatoia -f
).
Esempi:
Elimina la partizione del 1° marzo 2016 in una tabella partizionata giornaliera denominata
mydataset.mytable
nel tuo progetto predefinito:
bq rm --table 'mydataset.mytable$20160301'
Elimina la partizione di marzo 2016 in una tabella partizionata mensile:
bq rm --table 'mydataset.mytable$201603'
Elimina l'intervallo di numeri interi che inizia da 20 in un intervallo di numeri interi partizionato
tabella denominata mydataset.mytable
:
bq rm --table 'mydataset.mytable$20'
API
Chiama il tables.delete
e specifica il decorator della tabella e della partizione utilizzando il metodo tableId
.
Sicurezza delle tabelle partizionate
Il controllo dell'accesso per le tabelle partizionate è lo stesso del controllo dell'accesso per nelle tabelle standard. Per ulteriori informazioni, vedi Introduzione ai controlli di accesso alle tabelle.