Eseguire query sui dati protobuf
Questo documento fornisce esempi di pattern di query comuni per la lettura e l'esecuzione di query sui dati del buffer del protocollo (protobuf) archiviati in Bigtable.
Prima di leggere questa pagina, acquisisci familiarità con quanto segue:
Dati di esempio
Gli esempi seguenti utilizzano una tabella Music che memorizza informazioni su album e artisti. I dati vengono archiviati in una famiglia di colonne denominata album_details, con un qualificatore di colonna album. Il qualificatore di colonna contiene messaggi protobuf.
Lo schema protobuf è definito nei seguenti file proto:
artist.proto:syntax = "proto3"; package package_name; message Artist { string name = 1; }album.proto:syntax = "proto3"; package package_name; import "artist.proto"; message Album { string title = 1; Artist artist = 2; int32 release_year = 3; }
Di conseguenza, Bigtable crea un bundle di schema per questa tabella che contiene il seguente set di descrittori per queste definizioni protobuf:
file {
name: "artist.proto"
package: "package_name"
message_type {
name: "Artist"
field {
name: "name"
number: 1
label: LABEL_OPTIONAL
type: TYPE_STRING
json_name: "name"
}
}
syntax: "proto3"
}
file {
name: "album.proto"
package: "package_name"
dependency: "artist.proto"
message_type {
name: "Album"
field {
name: "title"
number: 1
label: LABEL_OPTIONAL
type: TYPE_STRING
json_name: "title"
}
field {
name: "artist"
number: 2
label: LABEL_OPTIONAL
type: TYPE_MESSAGE
type_name: ".package_name.Artist"
json_name: "artist"
}
field {
name: "release_year"
number: 3
label: LABEL_OPTIONAL
type: TYPE_INT32
json_name: "releaseYear"
}
}
syntax: "proto3"
}
Esempi di query
Gli esempi seguenti mostrano come eseguire query sui dati protobuf utilizzando GoogleSQL per le tabelle esterne Bigtable e BigQuery.
Eseguire il cast di una colonna in un messaggio protobuf
Puoi utilizzare l'operatore CAST per interpretare un valore BYTES come messaggio protobuf.
Per farlo, devi fornire il nome completo del messaggio protobuf nel
seguente formato:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.
Sostituisci quanto segue:
SCHEMA_BUNDLE_ID: l'ID univoco che hai assegnato al bundle di schemi quando l'hai creato.FULLY_QUALIFIED_MESSAGE_NAME: il nome completo del messaggio, che deve includere il nome del pacchetto definito nel file proto, ad esempiopackage_name.message_name.
La seguente query di esempio esegue il cast della colonna album nel messaggio protobuf Album. Questo messaggio è definito nel pacchetto package_name e fa parte di un bundle di schemi denominato bundle_name:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
Music;
Accedere ai campi nidificati
Puoi accedere ai campi nidificati all'interno di un messaggio protobuf utilizzando la notazione con il punto.
La seguente query recupera il nome dell'artista dal messaggio Artist
nidificato all'interno del messaggio Album:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
Music;
Filtra in base ai campi protobuf
Puoi utilizzare la clausola WHERE per filtrare le righe in base ai valori dei campi
all'interno di un messaggio protobuf.
La seguente query seleziona tutti gli album dell'artista Dana A.:
SELECT
*
FROM
Music
WHERE
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';
Campi protobuf aggregati
Puoi utilizzare funzioni di aggregazione come SUM, AVG, MIN, MAX e COUNT sui campi numerici all'interno dei messaggi protobuf.
La seguente query calcola l'anno di uscita medio di tutti gli album nella tabella:
SELECT
AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
Music;
Ordina in base ai campi protobuf
Puoi utilizzare la clausola ORDER BY per ordinare il set di risultati in base a un campo nel
messaggio protobuf.
La seguente query recupera tutti gli album e li ordina in base all'anno di uscita in ordine decrescente:
SELECT
*
FROM
Music
ORDER BY
CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;
Utilizzo con tabelle esterne BigQuery
Puoi eseguire query sui dati protobuf archiviati in Bigtable da BigQuery
creando una tabella esterna. Quando crei la tabella esterna, specifichi il tipo di colonna come JSON, la codifica come PROTO_BINARY e la associ a un bundle di schema. Questo processo converte i byte del messaggio protobuf nei
dati JSON equivalenti, consentendoti di eseguire query direttamente sui relativi campi.
Di seguito è riportato un esempio di file di definizione della tabella per
creare una tabella esterna BigQuery
nella tabella Music:
{
"sourceFormat": "BIGTABLE",
"sourceUris": [
"https://googleapis.com/bigtable/projects/PROJECT_ID/instances/INSTANCE_ID/tables/Music"
],
"bigtableOptions": {
"columnFamilies" : [
{
"familyId": "album_details",
"columns": [
{
"qualifierString": "album",
"type": "JSON",
"encoding": "PROTO_BINARY",
"protoConfig": {
"schemaBundleId": "bundle_name",
"protoMessageName": "package_name.Album"
}
}
]
}
]
}
}
Una volta creata la tabella esterna, puoi eseguire query sui dati protobuf come colonna JSON in BigQuery.
La seguente query recupera il titolo di tutti gli album pubblicati nel 2022 dalla tabella esterna BigQuery:
SELECT JSON_VALUE(value, '$.title') AS title
FROM
`PROJECT_ID.DATASET.TABLE_NAME` AS t,
UNNEST(t.album_details.album.cell)
WHERE INT64(JSON_EXTRACT(value, '$.releaseYear')) = 2022;
Passaggi successivi
- Scopri di più sulle best practice di progettazione dello schema per i protobuf.