Kontinuierliche Abfragen von materialisierten Ansichten

Wenn Sie eine kontinuierliche materialisierte Ansicht einer Bigtable-Tabelle erstellen möchten, führen Sie eine SQL-Abfrage aus, die die kontinuierliche materialisierte Ansicht definiert.

In diesem Dokument werden Konzepte und Muster beschrieben, die Ihnen bei der Vorbereitung Ihrer SQL-Abfrage für kontinuierliche materialisierte Ansichten helfen. Bevor Sie dieses Dokument lesen, sollten Sie mit kontinuierlich materialisierten Ansichten und GoogleSQL für Bigtable vertraut sein.

Für kontinuierliche materialisierte Ansichten wird eine eingeschränkte SQL-Syntax verwendet. Abfragen müssen das folgende Muster verwenden:

SELECT
  expression AS alias [, ...]
FROM from_item
[ WHERE bool_expression ]
GROUP BY expression [, ...]

from_item:
    {
      table_name [ as_alias ]
      | field_path
      }

as_alias:
    [ AS ] alias

Abfragebeschränkungen

Für eine SQL-Abfrage, mit der eine kontinuierliche materialisierte Ansicht erstellt wird, gelten die folgenden Regeln:

  • Muss eine SELECT-Anweisung sein
  • Muss eine GROUP BY-Klausel enthalten
  • Es dürfen nur unterstützte Aggregationsfunktionen verwendet werden.
  • Es muss mindestens eine Aggregationsspalte definiert werden.
  • Kann mehrere Aggregationen pro Gruppe haben

Unterstützte Aggregationen

Sie können die folgenden Aggregationsfunktionen in einer SQL-Abfrage verwenden, die eine kontinuierliche materialisierte Ansicht definiert:

  • COUNT
  • SUM
  • MIN
  • MAX
  • HLL_COUNT.INIT
  • HLL_COUNT.MERGE
  • HLL_COUNT.MERGE_PARTIAL
  • ANY_VALUE
  • BIT_AND
  • BIT_OR
  • BIT_XOR
  • AVG

Wenn Sie SELECT COUNT(*) angeben, müssen Sie einen Zeilenschlüssel definieren, wie im folgenden Beispiel:

SELECT
  '*' AS _key,
  COUNT(*) AS count
FROM
  foo
GROUP BY
  _key;

Nicht unterstützte SQL-Features

Die folgenden SQL-Funktionen können nicht verwendet werden:

  • Alle Funktionen, die von GoogleSQL for Bigtable nicht unterstützt werden
  • ARRAY
  • ARRAY_AGG
  • ARRAY_CONCAT_AGG
  • COUNT_IF
  • CURRENT_TIME und andere nicht deterministische Funktionen
  • DATE, DATETIME als Ausgabespalten (TIMESTAMP verwenden oder einen String speichern)
  • DESC in der Ausgabe sortieren
  • DISTINCT-Option, z. B. SUM(*DISTINCT* value))
  • LIMIT/OFFSET
  • ORDER BY
  • SELECT *
  • OVER-Klausel zum Erstellen einer Fensteraggregation
  • STRUCT

Außerdem können Sie keine GROUP BY-Klauseln verschachteln oder Kartenspalten erstellen. Weitere Einschränkungen finden Sie unter Einschränkungen.

Ausgeschlossene Zeilen vermeiden

Eingabezeilen werden in den folgenden Fällen aus einer kontinuierlichen materialisierten Ansicht ausgeschlossen:

  • Aus der Zeile werden mehr als 1 MiB Daten ausgewählt. Wenn Ihre Abfrage beispielsweise SELECT apple AS apples , SUM(banana) AS sum_bananas FROM my_table GROUP BY apples ist, werden alle Zeilen, die in den Spalten apple und banana mehr als 1 MiB Daten enthalten, aus der kontinuierlichen materialisierten Ansicht ausgeschlossen.
  • Aus der Zeile werden mehr als 1 MiB Daten ausgegeben. Dies kann passieren, wenn Sie Abfragen wie SELECT REPEAT(apple, 1000) oder große Konstanten verwenden.
  • Es werden mehr als zehnmal so viele Daten ausgegeben, wie ausgewählt wurden.
  • Die Abfrage stimmt nicht mit Ihren Daten überein. Dazu gehören der Versuch, eine Null zu teilen, ein Ganzzahlüberlauf oder die Erwartung eines Zeilenschlüsselformats, das nicht für jeden Zeilenschlüssel verwendet wird.

Ausgeschlossene Zeilen erhöhen den Messwert für Nutzerfehler bei der ersten Verarbeitung. Weitere Informationen zu Messwerten, mit denen Sie Ihre kontinuierlichen materialisierten Ansichten im Blick behalten können, finden Sie unter Messwerte.

Abfragedetails

In diesem Abschnitt wird eine kontinuierliche Abfrage einer materialisierten Ansicht beschrieben und wie die Ergebnisse aussehen können, wenn die Ansicht abgefragt wird. Die Daten in der Quelltabelle sind die Eingaben und die Ergebnisdaten in der kontinuierlichen materialisierten Ansicht sind die Ausgaben. Ausgabedaten sind entweder aggregiert oder nicht aggregiert (im definierten Schlüssel).

SELECT-Anweisung

Mit der SELECT-Klausel werden die Spalten und Aggregationen konfiguriert, die in der kontinuierlichen materialisierten Ansicht verwendet werden. Dabei muss eine GROUP BY-Klausel verwendet werden.

SELECT * wird nicht unterstützt, SELECT COUNT(*) jedoch schon.

Wie bei einer typischen SELECT-Anweisung können Sie für eine gruppierte Datenmenge mehrere Aggregationen verwenden. Die nicht gruppierten Spalten müssen ein Aggregationsergebnis sein.

Hier ein Beispiel für eine Standardabfrage für die GROUP BY-Aggregation in SQL:

SELECT
  myfamily["node"] AS node,
  myfamily["type"] AS type,
  COUNT(clicks) AS clicks_per_key
FROM
  mytable
GROUP BY
  node,
  type

Zeilenschlüssel und nicht aggregierte Daten

Optional können Sie eine _key-Ausgabespalte angeben, wie beim Definieren der kontinuierlichen materialisierten Ansicht. Diese Spalte unterscheidet sich von der Spalte _key, die Sie erhalten, wenn Sie eine SQL-Abfrage auf eine Bigtable-Tabelle ausführen. Wenn Sie eine _key angeben, gelten die folgenden Regeln:

  • Sie müssen nach _key gruppieren und können nur nach _timestamp gruppieren (optional). Weitere Informationen finden Sie unter Zeitstempel.
  • Die Spalte _key muss vom Typ BYTES sein.

Die Angabe eines _key ist nützlich, wenn Sie die Ansicht mit ReadRows statt mit SQL lesen möchten, da Sie so das Format des Zeilenschlüssels steuern können. Bei einer SQL-Abfrage für eine Ansicht mit einer definierten _key muss _key möglicherweise explizit decodiert werden, anstatt nur strukturierte Schlüsselspalten zurückzugeben.

Wenn Sie _key nicht verwenden, werden die nicht aggregierten Spalten in der SELECT-Anweisung zum Schlüssel in der kontinuierlichen materialisierten Ansicht. Sie können den Schlüsselspalten beliebige Namen zuweisen, die von SQL-Konventionen unterstützt werden.

Ihr SQL-Filter muss potenzielle NULL oder andere ungültige Werte entfernen, die zu Fehlern führen können. Eine ungültige Zeile wird aus den Ergebnissen ausgeschlossen und im Messwert materialized_view/user_errors gezählt. Wenn Sie Nutzerfehler beheben möchten, führen Sie die SQL-Abfrage außerhalb einer kontinuierlichen materialisierten Ansicht aus.

Nicht aggregierte Ausgabespalten müssen in der GROUP BY-Klausel enthalten sein. Die Reihenfolge, in der Spalten in der GROUP BY-Klausel geschrieben werden, ist die Reihenfolge, in der die Daten im Zeilenschlüssel der kontinuierlichen materialisierten Ansicht gespeichert werden. Beispiel: GROUP BY a, b, c ist implizit ORDER BY a ASC, b ASC, c ASC.

Aggregierte Daten

In den Summenspalten der Abfrage werden die Berechnungen definiert, mit denen die Daten in der kontinuierlichen materialisierten Ansicht generiert werden.

Der Alias für eine Summen- oder Durchschnittsspalte wird in der kontinuierlichen materialisierten Ansicht als Spaltenqualifizierer behandelt.

Dazu ein Beispiel:

SELECT
  fam["baz"] AS baz,
  SUM(fam["foo"]) AS sum_foo,
  SUM(fam["bar"]) AS sum_bar
FROM
  TABLE
GROUP BY
  baz;

Die Abfrage hat folgende Eigenschaften:

  • Die Ausgabe für jeden baz befindet sich in einer separaten Zeile in baz ASC-Reihenfolge.
  • Wenn eine bestimmte baz mindestens eine foo hat, ist sum_foo in der Ausgabezeile kein NULL-Wert.
  • Wenn eine bestimmte baz mindestens eine bar hat, ist sum_bar in der Ausgabezeile kein NULL-Wert.
  • Wenn ein bestimmter baz für keine der Spalten einen Wert hat, wird er aus den Ergebnissen ausgeschlossen.

Wenn Sie die Ansicht dann mit SELECT * abfragen, sieht das Ergebnis in etwa so aus:

baz sum_foo sum_bar
baz1 sum_foo1 sum_bar1
baz2 sum_foo2 sum_bar2

Zeitstempel

Der Standardzeitstempel für eine Ausgabezelle in einer kontinuierlichen materialisierten Ansicht ist 0 (1970-01-01 00:00:00Z). Dieser Wert ist sichtbar, wenn Sie die Ansicht mit ReadRows lesen, nicht aber, wenn Sie sie mit SQL abfragen.

Wenn Sie in der Ausgabe einen anderen Zeitstempel verwenden möchten, können Sie der SELECT-Liste der Abfrage eine Spalte vom Typ TIMESTAMP hinzufügen und sie _timestamp nennen. Wenn Sie die kontinuierliche materialisierte Ansicht mit ReadRows abfragen, wird _timestamp zum Zeitstempel für die anderen Zellen in der Zeile.

Ein Zeitstempel darf nicht NULL sein, muss größer oder gleich null sein und ein Vielfaches von 1.000 sein (Millisekundengenauigkeit). In Bigtable werden keine Zellenzeitstempel vor der Unix-Epoche (1970-01-01T00:00:00Z) unterstützt.

Im folgenden Beispiel werden aggregierte Daten nach Tag neu gesampelt. In der Abfrage wird die Funktion UNPACK verwendet.

SELECT
  _key,
  TIMESTAMP_TRUNC(_timestamp, DAY) AS _timestamp,
  SUM(sum_family["sum_column"]) AS sum_column,
  SUM(sum_family["foo"]) AS second_sum_column
FROM
  UNPACK(
  SELECT
    *
  FROM
    my_table(with_history => TRUE))
GROUP BY
  1,
  2

Wenn für ein bestimmtes SUM an einem bestimmten Tag eine Eingabe vorhanden ist, enthält die Ausgabezeile einen aggregierten Wert mit einem Zeitstempel, der mit dem abgeschnittenen Tag übereinstimmt.

Wenn Sie die Ansicht mit SELECT * abfragen, sieht das Ergebnis in etwa so aus:

_key _timestamp sum_column second_sum_column
1 01.05.2024 00:00:00Z 23 99
2 2. Mai 2024 00:00:00Z 45 201
3 3. Mai 2024 00:00:00Z NULL 56
4 4. Mai 2024 00:00:00Z 8 NULL

Codierung

Wenn Sie Ihre kontinuierliche materialisierte Ansicht mit SQL abfragen, müssen Sie nicht wissen, wie aggregierte Werte codiert werden, da die Ergebnisse in SQL als typisierte Spalten angezeigt werden.

Wenn Sie mit ReadRows Daten aus der Datenansicht lesen, müssen Sie die aggregierten Daten in Ihrem Leseaufruf decodieren. Weitere Informationen zu ReadRows-Anfragen finden Sie unter Lesungen.

Aggregierte Werte in einer kontinuierlichen materialisierten Ansicht werden mithilfe der in der folgenden Tabelle beschriebenen Codierung gespeichert. Dabei wird der Ausgabetyp der Spalte aus der Ansichtsdefinition verwendet.

Typ Codierung
BOOL 1-Byte-Wert, 1 = wahr, 0 = falsch
BYTES Keine Codierung
INT64 (oder INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) 64-Bit-Big-Endian
FLOAT64 64-Bit-IEEE 754, ausgenommen NaN und +/-inf
STRING UTF-8
ZEIT/TIMESTAMP 64-Bit-Ganzzahl, die die Anzahl der Mikrosekunden seit der Unix-Epoche darstellt (entspricht GoogleSQL)
Weitere Informationen finden Sie in der Data API-Referenz unter Codierung.

Nächste Schritte