Letture
Questa pagina descrive i tipi di richieste di lettura che puoi inviare a Bigtable, illustra le implicazioni per il rendimento e presenta alcuni consigli per tipi specifici di query. Prima di leggere questa pagina, dovresti acquisire familiarità con la panoramica di Bigtable.
Panoramica
Le richieste di lettura a Bigtable restituiscono i contenuti delle righe richieste in ordine di chiave, il che significa che vengono restituite nell'ordine in cui sono archiviate. Puoi leggere tutte le scritture che hanno restituito una risposta.
Le query supportate dalla tabella devono contribuire a determinare il tipo di lettura più adatto al tuo caso d'uso. Le richieste di lettura Bigtable rientrano in due categorie generali:
- Lettura di una singola riga
- Scansioni o lettura di più righe
Le letture sono atomiche a livello di riga. Ciò significa che quando invii una richiesta di lettura per una riga, Bigtable restituisce l'intera riga o, in caso di errore della richiesta, nessuna riga. Una riga parziale non viene mai restituita a meno che tu non ne richieda specificamente una.
Ti consigliamo vivamente di utilizzare le nostre librerie client Cloud Bigtable per leggere i dati da una tabella anziché chiamare direttamente l'API. Esempi di codice che mostrano come inviare richieste di lettura sono disponibili in più lingue. Tutte le richieste di lettura effettuano la chiamata API ReadRows
.
Lettura dei dati con il serverless computing di Data Boost
Bigtable Data Boost consente di eseguire query e job di lettura batch senza influire sul traffico giornaliero delle applicazioni. Data Boost è un servizio di serverless computing che puoi utilizzare per leggere i dati Bigtable mentre l'applicazione principale utilizza i nodi del cluster per il computing.
Data Boost è ideale per le scansioni e non è consigliato per le letture di una sola riga. Non puoi utilizzare Data Boost per le scansioni inverse. Per maggiori informazioni e criteri di idoneità, consulta la panoramica di Data Boost.
Letture di una sola riga
Puoi richiedere una singola riga in base alla chiave di riga. Le letture di una sola riga, note anche come letture puntuali, non sono compatibili con Data Boost. Sono disponibili esempi di codice per le seguenti varianti:
Scansioni
Le scansioni sono il modo più comune per leggere i dati Bigtable. Puoi leggere un intervallo di righe contigue o più intervalli di righe da Bigtable specificando un prefisso della chiave di riga o specificando le chiavi di riga iniziale e finale. Sono disponibili esempi di codice per le seguenti varianti:
- Lettura di un intervallo di righe
- Lettura di più intervalli di righe
- Lettura di più righe utilizzando un prefisso della chiave
Scansioni inverse
Le scansioni inverse consentono di leggere un intervallo di righe all'indietro specificando un prefisso della chiave di riga o un intervallo di righe. Il prefisso della chiave di riga viene utilizzato come punto di partenza della scansione per la lettura all'indietro. Se specifichi un intervallo di righe, la chiave di riga finale viene utilizzata come punto di partenza della scansione.
La scansione in ordine inverso può essere utile nei seguenti scenari:
- Vuoi trovare un evento (riga) e leggere i precedenti N eventi.
- Vuoi trovare il valore più alto prima di un determinato valore. Questo può essere utile quando memorizzi dati di serie temporali utilizzando un timestamp come suffisso della chiave di riga.
Le scansioni inverse sono meno efficienti delle scansioni in avanti. In generale, progetta le chiavi di riga in modo che la maggior parte delle scansioni sia in avanti. Utilizza le scansioni inverse per scansioni brevi, ad esempio 50 righe o meno, per mantenere un tempo di risposta a bassa latenza.
Per eseguire la scansione al contrario, imposta il valore del campo ReadRowsRequest
reversed
su true. Il valore predefinito è false.
Le scansioni inverse sono disponibili quando utilizzi le seguenti librerie client:
- Libreria client Bigtable per C++ versione 2.18.0 o successive
- Libreria client Bigtable per Go versione 1.21.0 o successive
- Libreria client Bigtable per Java versione 2.24.1 o successive
- Client Bigtable HBase per Java versione 2.10.0 o successive
Per esempi di codice che mostrano come utilizzare le scansioni inverse, vedi Scansione inversa.
Esempi di casi d'uso
I seguenti esempi mostrano come utilizzare le scansioni inverse per trovare l'ultima volta che un cliente ha modificato la password e le fluttuazioni di prezzo di un prodotto in un determinato giorno.
Reimpostazioni password
Considera l'ipotesi che le chiavi di riga contengano ciascuna un ID cliente e una
data, nel formato 123ABC#2022-05-02
, e che una delle colonne sia
password_reset
, che memorizza l'ora in cui è stata reimpostata la password.
Bigtable archivia automaticamente i dati in ordine lessicografico, come
di seguito. Tieni presente che la colonna non esiste per le righe (giorni) in cui la password
non è stata reimpostata.
`123ABC#2022-02-12,password_reset:03`
`123ABC#2022-04-02,password_reset:11`
`123ABC#2022-04-14`
`123ABC#2022-05-02`
`223ABC#2022-05-22`
Se vuoi trovare l'ultima volta che il cliente 123ABC
ha reimpostato la password,
puoi scorrere all'indietro un intervallo da 123ABC#
a 123ABC#<DATE>
, utilizzando la data
odierna o una data futura, per tutte le righe che contengono la colonna
password_reset
con un limite di righe pari a 1.
Modifiche ai prezzi
In questo esempio, le chiavi di riga contengono valori per prodotto, modello e timestamp e una delle colonne contiene il prezzo del prodotto e del modello in un determinato momento.
`productA#model2#1675604471,price:82.63`
`productA#model2#1676219411,price:82.97`
`productA#model2#1677681011,price:83.15`
`productA#model2#1680786011,price:83.99`
`productA#model2#1682452238,price:83.12`
Se vuoi trovare le fluttuazioni di prezzo intorno al prezzo del 14 febbraio
2023, anche se non esiste una chiave di riga per quella data specifica nella
tabella, puoi eseguire una scansione in avanti a partire dalla chiave di riga
productA#model2#1676376000
per N righe, quindi eseguire una scansione inversa
per lo stesso numero di righe a partire dalla stessa riga iniziale. Le due scansioni mostrano
i prezzi prima e dopo l'ora specificata.
Letture filtrate
Se hai bisogno solo di righe che contengono valori specifici o righe parziali, puoi utilizzare un filtro con la richiesta di lettura. I filtri ti consentono di selezionare con precisione i dati che ti interessano.
I filtri ti consentono anche di assicurarti che le letture corrispondano alle norme di Garbage Collection utilizzate dalla tabella. Questa funzionalità è particolarmente utile se scrivi spesso nuove celle con timestamp in colonne esistenti. Poiché la garbage collection può richiedere fino a una settimana per rimuovere i dati scaduti, l'utilizzo di un filtro per intervallo di timestamp per leggere i dati può garantire di non leggere più dati del necessario.
La panoramica dei filtri fornisce spiegazioni dettagliate dei tipi di filtri che puoi utilizzare. Utilizzo dei filtri mostra esempi in più lingue.
Leggere i dati da una vista autorizzata
Per leggere i dati da una vista autorizzata, devi utilizzare uno dei seguenti elementi:
- Interfaccia a riga di comando gcloud
- Client Bigtable per Java
Le altre librerie client Bigtable non supportano ancora l'accesso in sola visualizzazione.
È supportato qualsiasi metodo che chiama il metodo ReadRows
o SampleRowKeys
dell'API Bigtable Data. Quando crei il client, fornisci l'ID vista autorizzata
oltre all'ID tabella.
Leggere i dati da una vista materializzata continua
Puoi leggere i dati da una vista materializzata continua utilizzando SQL o la chiamata all'ReadRows
API Data. Le viste materializzate continue sono di sola lettura. I dati in una vista materializzata
vengono digitati in base alla query che li
definisce.
SQL
Per leggere i dati da una vista materializzata continua utilizzando SQL, puoi utilizzare l'editor di query Bigtable Studio o una delle librerie client che supportano le query SQL.
SQL espone automaticamente i risultati delle query come colonne digitate, quindi non è necessario gestire la codifica nella query.
Quando crei una vista materializzata continua, Bigtable crea automaticamente uno schema della chiave di riga per la tabella che definisce le chiavi di riga strutturate per la vista. Per ulteriori informazioni sull'esecuzione di query sulle chiavi di riga strutturate con SQL, consulta la pagina Query sulle chiavi di riga strutturate.
API di dati
Se prevedi di leggere da una vista materializzata continua con una chiamata ReadRows
da una delle librerie client per Bigtable, devi esaminare
la query SQL utilizzata per definire la vista. Prendi nota se la visualizzazione ha una
colonna _key
definita, consigliata per le visualizzazioni destinate alla lettura
utilizzando ReadRows
, e se ha una colonna _timestamp
.
Devi anche conoscere il tipo di ogni colonna e decodificare i dati delle colonne nel codice dell'applicazione.
I valori aggregati in una vista materializzata continua vengono archiviati utilizzando la codifica descritta nella tabella seguente, in base al tipo di output della colonna della definizione della vista.
Tipo | Codifica |
---|---|
BOOL | Valore di 1 byte, 1 = true, 0 = false |
BYTES | Nessuna codifica |
INT64 (o INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | 64 bit big-endian |
FLOAT64 | IEEE 754 a 64 bit, escluso NaN e +/-inf |
STRING | UTF-8 |
TIME/TIMESTAMP | Numero intero a 64 bit che rappresenta il numero di microsecondi trascorsi dall'epoca Unix (coerente con GoogleSQL) |
Oltre a conoscere il tipo di ogni colonna nella visualizzazione, devi conoscere
la famiglia di colonne e il qualificatore di colonna. La famiglia di colonne predefinita si chiama
default
e il qualificatore di colonna è l'alias specificato nella query
di definizione. Ad esempio, considera una vista materializzata continua definita con questa
query:
SELECT
_key,
SUM(clicks) AS sum_clicks
FROM
mytable
GROUP BY
sum_clicks
Quando esegui una query sulla visualizzazione con ReadRows
, fornisci la famiglia di colonne default
e il qualificatore di colonna sum_clicks
.
Letture e prestazioni
Le letture che utilizzano filtri sono più lente di quelle senza filtri e aumentano l'utilizzo della CPU. D'altra parte, possono ridurre significativamente la quantità di larghezza di banda di rete utilizzata, limitando la quantità di dati restituiti. In generale, i filtri devono essere utilizzati per controllare l'efficienza del throughput, non la latenza.
Se vuoi ottimizzare le prestazioni di lettura, valuta le seguenti strategie:
Limita il rowset il più possibile. Limitare il numero di righe che i nodi devono scansionare è il primo passo per migliorare il tempo al primo byte e la latenza complessiva delle query. Se non limiti il rowset, Bigtable dovrà quasi certamente eseguire la scansione dell'intera tabella. Per questo motivo, ti consigliamo di progettare lo schema in modo che consenta alle query più comuni di funzionare in questo modo.
Per un ulteriore ottimizzazione delle prestazioni dopo aver limitato il set di righe, prova ad aggiungere un filtro di base. La limitazione dell'insieme di colonne o del numero di versioni restituite in genere non aumenta la latenza e a volte può aiutare Bigtable a cercare in modo più efficiente i dati non pertinenti in ogni riga.
Se vuoi perfezionare ulteriormente il rendimento di lettura dopo le prime due strategie, ti consigliamo di utilizzare un filtro più complesso. Potresti provare questa soluzione per alcuni motivi:
- Continui a ricevere molti dati che non ti interessano.
- Vuoi semplificare il codice dell'applicazione inserendo la query in Bigtable.
Tieni presente, tuttavia, che i filtri che richiedono condizioni, interleaving o corrispondenza di espressioni regolari su valori di grandi dimensioni tendono a fare più danni che benefici se consentono il passaggio della maggior parte dei dati scansionati. Questo danno si manifesta sotto forma di maggiore utilizzo della CPU nel cluster senza grandi risparmi lato client.
Oltre a queste strategie, evita di leggere un numero elevato di chiavi di riga o intervalli di righe non contigui in una singola richiesta di lettura. Quando richiedi centinaia di chiavi di riga o intervalli di righe in una singola richiesta, Bigtable analizza la tabella e legge le righe richieste in sequenza. Questa mancanza di parallelismo influisce sulla latenza complessiva e qualsiasi lettura che raggiunge un nodo caldo può aumentare la latenza di coda. Più intervalli di righe vengono richiesti, più tempo richiede il completamento della lettura. Se questa latenza è inaccettabile, devi invece inviare più richieste simultanee, ognuna delle quali recupera un numero inferiore di intervalli di righe.
In generale, la lettura di più intervalli di righe in una singola richiesta ottimizza la velocità effettiva, ma non la latenza. La lettura di un numero inferiore di intervalli di righe in più richieste simultanee ottimizza la latenza, ma non la velocità effettiva. Trovare il giusto equilibrio tra latenza e velocità effettiva dipende dai requisiti dell'applicazione e si può ottenere regolando il conteggio delle richieste di lettura simultanee e il numero di intervalli di righe in una richiesta.
Righe grandi
Bigtable applica i seguenti limiti alle righe di grandi dimensioni:
256 MB è la dimensione massima di una riga. Se devi leggere una riga che è diventata più grande del limite, puoi paginare la richiesta e utilizzare un filtro
cells per row limit
e un filtrocells per row offset
. Tieni presente che se arriva una scrittura per la riga tra le richieste di lettura paginata, la lettura potrebbe non essere atomica.512 KB è la dimensione massima di una chiamata API
ReadRows
. Se superi il limite, Bigtable restituisce un erroreINVALID_ARGUMENT
.
Passaggi successivi
- Implementa i contatori utilizzando le celle aggregate.
- Leggi una panoramica dei filtri.
- Consulta gli esempi di codice che mostrano come utilizzare i filtri.
- Scopri di più sui tipi di richieste di scrittura che puoi inviare a Bigtable.
- Utilizza l'emulatore Bigtable.