Avro-Daten abfragen

Mit GoogleSQL für Bigtable können Sie einzelne Felder aus serialisierten Apache Avro-Datensätzen, die in Bigtable-Tabellen gespeichert sind, abfragen, filtern und projizieren. Wenn Sie in Ihren SQL-Abfragen auf ein Avro-Schemabundle verweisen, können Sie Byte-Spalten in strukturierte Avro-Datensätze umwandeln und verschachtelte Felder extrahieren.

Bevor Sie Avro-Felder abfragen können, müssen Sie Ihre Avro-Schemas in einem Schema-Bundle hochladen, wie unter Avro-Schemas erstellen und verwalten beschrieben. Informationen dazu, wie GoogleSQL-Abfragen Bigtable-Tabellenschemas zugeordnet werden und wie Sie in SQL-Anweisungen auf Spalten verweisen, finden Sie in der Übersicht über GoogleSQL für Bigtable.

Wenn Sie Avro-Daten mit GoogleSQL in Java abfragen möchten, verwenden Sie die Methode executeQuery in der Cloud Bigtable-Clientbibliothek. Beispiele für das Ausführen von SQL-Abfragen mit Clientbibliotheken finden Sie unter Clientbibliotheken.

Avro-Datentypzuordnungen

Wenn Sie serialisierte BYTES in einen Avro-Datensatz umwandeln, ordnet GoogleSQL for Bigtable die Avro-Schematypen den SQL-zugänglichen Typen so zu:

Avro-Typ GoogleSQL-Darstellung Beschreibung
int, long INT64 Vorzeichenbehaftete 32-Bit- und 64-Bit-Ganzzahlen werden 64-Bit-Ganzzahlen zugeordnet.
float FLOAT32 Ein Gleitkommawert mit einfacher Genauigkeit
double FLOAT64 Ein Gleitkommawert mit doppelter Genauigkeit
boolean BOOL Ein boolescher Wert (TRUE oder FALSE)
string STRING Eine Unicode-Zeichenfolge
bytes BYTES Eine Sequenz von Rohbyte
record Nachrichtenobjekt Greifen Sie mit der Punktnotation auf verschachtelte Felder zu (z. B. record.field).
enum ENUM Ein aufgezählter Symbolsatz
array ARRAY Ein wiederkehrendes Feld. Bigtable unterstützt keine verschachtelten Arrays.
map<T> Wiederholte Schlüssel/Wert-Einträge Avro-Maps haben STRING-Schlüssel. Bigtable unterstützt Maps mit Nullwerten, z. B. {"type": "map", "values": ["null", "string"]}. Mit der Funktion ARRAY_TRANSFORM können Sie die Maps in ein ARRAY<STRUCT<key STRING, value T>> umwandeln.
union Feld, in dem Nullwerte zulässig sind Bigtable ordnet eine Union mit einem Null- und einem Nicht-Null-Typ einem standardmäßigen Nullable-Feld zu.
fixed Bigtable unterstützt den Typ fixed nicht. Eine Bytesequenz mit fester Länge.

Beispieldaten

In den Beispielen auf dieser Seite wird ein Avro-Schema-Bundle mit der ID my_avro verwendet. Dieses Bundle enthält das folgende Transaction-Datensatzschema im Namespace com.example.billing:

{
  "type": "record",
  "namespace": "com.example.billing",
  "name": "Transaction",
  "fields": [
    {"name": "product_name", "type": "string"},
    {"name": "product_category", "type": "string"},
    {"name": "configs", "type": {"type": "map", "values": "string"}}
  ]
}

In einer Bigtable-Tabelle namens table werden die serialisierten Avro-Datensätze in der Spaltenfamilie cf und dem Spaltenqualifizierer product (cf['product']) gespeichert:

Zeilenschlüssel Spalte cf['product'] (gespeichert als serialisiertes BYTES, zur besseren Lesbarkeit als JSON angezeigt)
row1 {"product_name": "Chips", "product_category": "yummy food", "configs": {"size": "large", "flavor": "BBQ"}}
row2 {"product_name": "Apple", "product_category": "yummy food", "configs": {}}
row3 {"product_name": "Book", "product_category": "reading", "configs": {"author": "Jane Doe"}}

Beispielabfragen

Nachdem Sie Ihr Avro-Schemabundle hochgeladen haben, können Sie den Operator CAST in GoogleSQL for Bigtable verwenden, um BYTES-Werte als Avro-Datensatz zu interpretieren.

Spalte umwandeln und Feld projizieren

Wenn Sie einen BYTES-Wert in einen Avro-Datensatz umwandeln möchten, geben Sie den vollständigen Datensatznamen im folgenden Format an:

SCHEMA_BUNDLE_ID.FULLY_QUALIFIED_RECORD_NAME

Ersetzen Sie Folgendes:

  • SCHEMA_BUNDLE_ID: die ID des Schema-Bundles
  • FULLY_QUALIFIED_RECORD_NAME: der vollständige Name des Avro-Datensatzes, einschließlich des in Ihrem Avro-Schema definierten Namespace, z. B. com.example.billing.Transaction

Wenn das angegebene Schema-Bundle oder der angegebene Datensatzname nicht vorhanden ist, schlägt die Abfrage mit dem Status INVALID_ARGUMENT und der Fehlermeldung type not found fehl. Wenn das bereitgestellte Schema die Zellenbytes nicht parsen kann, schlägt die Abfrage mit dem Status FAILED_PRECONDITION oder INVALID_ARGUMENT fehl.

Mit der folgenden Abfrage wird die Spalte cf['product'] in den Eintrag com.example.billing.Transaction im Schemabundle my_avro umgewandelt und das Feld product_name projiziert:

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table;

Die Abfrage gibt das folgende Ergebnis zurück:

product_name (STRING)
Chips
Apple
Buch

Nach Avro-Feldern filtern

Sie können eine WHERE-Klausel verwenden, um Zeilen anhand der Werte von Feldern in einem Avro-Datensatz zu filtern.

Mit der folgenden Abfrage werden Zeilen gefiltert, in denen das Feld product_category den Wert "yummy food" hat:

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name
FROM
  table
WHERE
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_category = "yummy food";

Die Abfrage gibt das folgende Ergebnis zurück:

product_name (STRING)
Chips
Apple

Auf Kartenfelder zugreifen

Mit der Funktion ARRAY_TRANSFORM können Sie Schlüssel/Wert-Paare aus einem Avro-map-Feld als Array von STRUCT-Elementen projizieren.

Die folgende Abfrage projiziert product_name und wandelt das Kartenfeld configs in ein Array von STRUCT<key STRING, value STRING>-Elementen um:

SELECT
  CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name,
  ARRAY_TRANSFORM(
    CAST(cf['product'] AS my_avro.com.example.billing.Transaction).configs,
    e -> STRUCT(e.key, e.value)
  ) AS map_array
FROM
  table;

Die Abfrage gibt das folgende Ergebnis zurück:

product_name (STRING) map_array (ARRAY<STRUCT<key STRING, value STRING>>)
Chips [{"key": "size", "value": "large"}, {"key": "flavor", "value": "BBQ"}]
Apple []
Buch [{"key": "author", "value": "Jane Doe"}]

Mit Ansichten verwenden

Sie können in kontinuierlichen materialisierten Ansichten und logischen Ansichten auf Avro-Schemabundles verweisen.

Wenn eine kontinuierliche materialisierte Ansicht oder eine logische Ansicht auf ein Avro-Schema-Bundle verweist, können Sie das Bundle nicht löschen. Bevor Sie das Bundle löschen, müssen Sie alle kontinuierlichen materialisierten Ansichten löschen, die darauf verweisen. Alle logischen Ansichten, die auf das Bundle verweisen, müssen entweder aktualisiert werden, um den Verweis zu entfernen, oder gelöscht werden.

Mit dem folgenden Befehl wird eine kontinuierliche materialisierte Ansicht erstellt, in der die Anzahl der Transaktionen nach product_name aggregiert wird:

gcloud bigtable materialized-views create MATERIALIZED_VIEW_ID \
    --instance=INSTANCE_ID \
    --query="SELECT CAST(cf['product'] AS my_avro.com.example.billing.Transaction).product_name AS product, COUNT(*) AS transaction_count FROM table GROUP BY product;"

Ersetzen Sie Folgendes:

  • MATERIALIZED_VIEW_ID: die ID der kontinuierlichen materialisierten Ansicht, die auf das Schemabundle verweist
  • INSTANCE_ID: die ID der Bigtable-Instanz

Nächste Schritte