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 FunktionenDATE
,DATETIME
als Ausgabespalten (TIMESTAMP
verwenden oder einen String speichern)DESC
in der Ausgabe sortierenDISTINCT
-Option, z. B.SUM(*DISTINCT* value)
)LIMIT/OFFSET
ORDER BY
SELECT *
OVER
-Klausel zum Erstellen einer FensteraggregationSTRUCT
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 Spaltenapple
undbanana
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 TypBYTES
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 inbaz ASC
-Reihenfolge. - Wenn eine bestimmte
baz
mindestens einefoo
hat, istsum_foo
in der Ausgabezeile kein NULL-Wert. - Wenn eine bestimmte
baz
mindestens einebar
hat, istsum_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) |
Nächste Schritte
- Kontinuierliche materialisierte Ansichten erstellen und verwalten
- Referenzdokumentation zu GoogleSQL for Bigtable