Protobuf-Daten abfragen
In diesem Dokument finden Sie Beispiele für gängige Abfragemuster zum Lesen und Abfragen von Protokollpufferdaten (protobuf), die in Bigtable gespeichert sind.
Bevor Sie diese Seite lesen, sollten Sie sich mit Folgendem vertraut machen:
Beispieldaten
In den folgenden Beispielen wird die Tabelle Music verwendet, in der Informationen zu Alben und Künstlern gespeichert sind. Die Daten werden in einer Spaltenfamilie mit dem Namen album_details und dem Spaltenqualifizierer album gespeichert. Der Spaltenqualifizierer enthält Protobuf-Nachrichten.
Das Protobuf-Schema ist in den folgenden Proto-Dateien definiert:
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; }
Daher erstellt Bigtable ein Schemabundle für diese Tabelle, das den folgenden Deskriptorsatz für diese Protobuf-Definitionen enthält:
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"
}
Beispielabfragen
In den folgenden Beispielen wird gezeigt, wie Sie Protobuf-Daten mit GoogleSQL für externe Bigtable- und BigQuery-Tabellen abfragen.
Spalte in eine Protobuf-Nachricht umwandeln
Mit dem Operator CAST können Sie einen BYTES-Wert als Protobuf-Nachricht interpretieren.
Dazu müssen Sie den vollständigen Namen der Protobuf-Nachricht im folgenden Format angeben:
SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_MESSAGE_NAME.
Ersetzen Sie Folgendes:
SCHEMA_BUNDLE_ID: Die eindeutige ID, die Sie Ihrem Schemabundle beim Erstellen zugewiesen haben.FULLY_QUALIFIED_MESSAGE_NAME: Der vollständige Name der Nachricht, der den in Ihrer Proto-Datei definierten Paketnamen enthalten muss, z. B.package_name.message_name.
In der folgenden Beispielabfrage wird die Spalte album in die Protobuf-Nachricht Album umgewandelt. Diese Nachricht ist im Paket package_name definiert und gehört zu einem Schemabundle namens bundle_name:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
Music;
Auf verschachtelte Felder zugreifen
Sie können mit der Punktnotation auf verschachtelte Felder in einer Protobuf-Nachricht zugreifen.
Mit der folgenden Abfrage wird der Name des Künstlers aus der verschachtelten Artist-Nachricht in der Album-Nachricht abgerufen:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name
FROM
Music;
Nach Protobuf-Feldern filtern
Mit der WHERE-Klausel können Sie Zeilen anhand der Werte von Feldern in einer Protobuf-Nachricht filtern.
Mit der folgenden Abfrage werden alle Alben des Künstlers Dana A. ausgewählt:
SELECT
*
FROM
Music
WHERE
CAST(album_details['album'] AS bundle_name.package_name.Album).artist.name = 'Dana A.';
Aggregierte Protobuf-Felder
Sie können Aggregatfunktionen wie SUM, AVG, MIN, MAX und COUNT für numerische Felder in Ihren Protobuf-Nachrichten verwenden.
Mit der folgenden Abfrage wird das durchschnittliche Erscheinungsjahr aller Alben in der Tabelle berechnet:
SELECT
AVG(CAST(album_details['album'] AS bundle_name.package_name.Album).release_year)
FROM
Music;
Nach Protobuf-Feldern sortieren
Mit der ORDER BY-Klausel können Sie das Ergebnis-Set anhand eines Felds in Ihrer Protobuf-Nachricht sortieren.
Mit der folgenden Abfrage werden alle Alben abgerufen und absteigend nach Veröffentlichungsjahr sortiert:
SELECT
*
FROM
Music
ORDER BY
CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;
Mit externen BigQuery-Tabellen verwenden
Sie können in Bigtable gespeicherte Protobuf-Daten über BigQuery abfragen, indem Sie eine externe Tabelle erstellen. Beim Erstellen der externen Tabelle geben Sie den Spaltentyp als JSON und die Codierung als PROTO_BINARY an und verknüpfen sie mit einem Schemabundle. Bei diesem Vorgang werden die Protobuf-Nachricht-Bytes in die entsprechenden JSON-Daten konvertiert, sodass Sie die Felder direkt abfragen können.
Im Folgenden sehen Sie ein Beispiel für eine Tabellendefinitionsdatei zum Erstellen einer externen BigQuery-Tabelle für die Tabelle 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"
}
}
]
}
]
}
}
Nachdem die externe Tabelle erstellt wurde, können Sie die Protobuf-Daten als JSON-Spalte in BigQuery abfragen.
Mit der folgenden Abfrage wird der Titel aller Alben abgerufen, die 2022 aus der externen BigQuery-Tabelle veröffentlicht wurden:
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;