Protobuf-Daten abfragen
Dieses Dokument enthält Beispiele für gängige Abfragemuster zum Lesen und Abfragen von Protokollzwischenspeicherdaten (Protobuf), die in Bigtable gespeichert sind.
Bevor Sie diese Seite lesen, sollten Sie sich mit Folgendem vertraut machen:
Beispieldaten
In den folgenden Beispielen wird eine Music-Tabelle verwendet, in der Informationen zu Alben und Künstlern gespeichert sind. Die Daten werden in einer Spaltenfamilie namens album_details mit 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; }
Bigtable erstellt daraufhin ein Schema-Bundle für diese Tabelle, das den folgenden Protobuf-Dateideskriptorsatz 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 Bigtable und externen 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 Schemapaket 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 Teil eines Schemabündels mit dem Namen bundle_name:
SELECT
CAST(album_details['album'] AS bundle_name.package_name.Album).title
FROM
Music;
Auf verschachtelte Felder zugreifen
Sie können auf verschachtelte Felder in einer Protobuf-Nachricht mit der Punktnotation 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.';
Protobuf-Felder aggregieren
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 die Ergebnismenge anhand eines Felds in Ihrer Protobuf-Nachricht sortieren.
Mit der folgenden Abfrage werden alle Alben abgerufen und in absteigender Reihenfolge nach ihrem Erscheinungsjahr sortiert:
SELECT
*
FROM
Music
ORDER BY
CAST(album_details['album'] AS bundle_name.package_name.Album).release_year DESC;
Mit Ansichten verwenden
Sie können kontinuierliche materialisierte Ansichten oder logische Ansichten erstellen, die Protobuf-Daten lesen.
Mit dem folgenden Befehl wird eine logische Ansicht erstellt, die alle Felder in der Album-Nachricht extrahiert:
QUERY="SELECT _key, CAST(album_details['album'] AS bundle_name.package_name.Album).* FROM Music"
gcloud bigtable logical-views create LOGICAL_VIEW_ID \
--instance=INSTANCE_ID \
--query=$QUERY
Ersetzen Sie Folgendes:
LOGICAL_VIEW_ID: die ID der logischen Ansicht, die auf das Schema-Bundle verweist.INSTANCE_ID: die ID der Instanz, die Sie zum Erstellen des Schemapakets verwenden.
Wenn eine Ansicht auf ein Schema-Bundle verweist, müssen Sie die Ansicht löschen, bevor Sie das Bundle löschen können. Aktualisieren Sie das Schema-Bundle auch nicht auf einen neuen Protobuf-Dateideskriptorsatz, der nicht mit dem vorhandenen abwärtskompatibel ist.
Mit externen BigQuery-Tabellen verwenden
Sie können in Bigtable gespeicherte Protobuf-Daten aus 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 Schemabündel. Bei diesem Vorgang werden die Protobuf-Nachrichtenbytes in die entsprechenden JSON-Daten konvertiert, sodass Sie die Felder direkt abfragen können.
Im Folgenden finden Sie ein Beispiel für eine Tabellendefinitionsdatei zum Erstellen einer externen BigQuery-Tabelle über 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 werden die Titel aller Alben, die 2022 veröffentlicht wurden, aus der externen BigQuery-Tabelle abgerufen:
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;