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-BundlesFULLY_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 verweistINSTANCE_ID: die ID der Bigtable-Instanz