Durchsetzung von Datentypen in Bigtable
Mit dem flexiblen Schema von Bigtable können Sie Daten beliebigen Typs – Strings, Datumsangaben, Zahlen, JSON-Dokumente oder sogar Bilder oder PDFs – in einer Bigtable-Tabelle speichern.
In diesem Dokument wird beschrieben, wann Bigtable den Typ erzwingt und Sie ihn in Ihrem Anwendungscode codieren oder decodieren müssen. Eine Liste der Bigtable-Datentypen finden Sie in der Data API-Referenzdokumentation unter Type.
Erzwungene Typen
Der Datentyp wird für die folgenden Daten erzwungen:
- Spaltenfamilien zusammenfassen (Zähler)
- Zeitstempel
- Materialisierte Ansichten
Aggregate
Beim Datentyp aggregate hängt die Codierung vom Zusammenfassungstyp ab. Wenn Sie eine aggregierte Spaltenfamilie erstellen, müssen Sie einen Aggregationstyp angeben.
In dieser Tabelle sind der Eingabetyp und die Codierung für jeden Aggregationstyp aufgeführt.
Aggregationstyp | Eingabetyp | Codierung |
---|---|---|
Summe | INT64 |
BigEndianBytes
|
Min. | INT64 |
BigEndianBytes
|
Max. | INT64 |
BigEndianBytes
|
HLL | Byte | Zetasketch HLL++ |
Wenn Sie die Daten in aggregierten Zellen mit SQL abfragen, werden Typinformationen automatisch in SQL berücksichtigt.
Wenn Sie die Daten in aggregierten Zellen mit der ReadRows
-Methode der Data API lesen, gibt Bigtable Byte zurück. Ihre Anwendung muss die Werte also mit der Codierung decodieren, die Bigtable verwendet hat, um die typisierten Daten in Byte umzuwandeln.
Sie können eine Spaltenfamilie, die keine aggregierten Daten enthält, nicht in eine aggregierte Spaltenfamilie umwandeln. Spalten in aggregierten Spaltenfamilien dürfen keine nicht aggregierten Zellen enthalten und Standardspaltenfamilien dürfen keine aggregierten Zellen enthalten.
Weitere Informationen zum Erstellen von Tabellen mit aggregierten Spaltenfamilien finden Sie unter Tabelle erstellen. Codebeispiele zum Erhöhen einer aggregierten Zelle mit codierten Werten finden Sie unter Wert erhöhen.
Zeitstempel
Jede Bigtable-Zelle hat einen Int64
-Zeitstempel, der ein Mikrosekundenwert mit höchstens Millisekundenpräzision sein muss. Bigtable lehnt einen Zeitstempel mit Mikrosekundenpräzision wie 3023483279876543 ab. In diesem Beispiel ist der zulässige Zeitstempelwert 3023483279876000. Ein Zeitstempel ist die Anzahl der Mikrosekunden seit der Unix-Epoche 1970-01-01 00:00:00 UTC
.
Kontinuierliche materialisierte Ansichten
Kontinuierliche materialisierte Ansichten sind schreibgeschützte Ressourcen, die Sie mit SQL oder einem ReadRows
Data API-Aufruf lesen können. Daten in einer materialisierten Ansicht werden basierend auf der Abfrage, mit der sie definiert wird, typisiert. Eine Übersicht finden Sie unter Kontinuierliche materialisierte Ansichten.
Wenn Sie eine Continuous Materialized View mit SQL abfragen, werden Typinformationen automatisch in SQL aufgenommen.
Wenn Sie mit einer Data API-ReadRows
-Anfrage Daten aus einer kontinuierlichen materialisierten Ansicht lesen, müssen Sie den Typ jeder Spalte kennen und sie in Ihrem Anwendungscode decodieren.
Aggregierte Werte in einer kontinuierlichen materialisierten Ansicht werden mit der in der folgenden Tabelle beschriebenen Codierung gespeichert, basierend auf dem Ausgabetyp der Spalte aus der Ansichtsdefinition.
Typ | Codierung |
---|---|
BOOL | 1-Byte-Wert, 1 = „true“, 0 = „false“ |
BYTES | Keine Codierung |
INT64 (oder INT, SMALLINT, INTEGER, BIGINT, TINYINT, BYTEINT) | 64‑Bit, Big-Endian |
FLOAT64 | 64-Bit-IEEE 754, ohne NaN und +/-inf |
STRING | UTF-8 |
TIME/TIMESTAMP | 64-Bit-Ganzzahl, die die Anzahl der Mikrosekunden seit der Unix-Epoche darstellt (entspricht GoogleSQL) |
Strukturierte Zeilenschlüssel
Mit strukturierten Zeilenschlüsseln können Sie mit mehrspaltigen Schlüsseln auf Ihre Daten zugreifen, ähnlich wie mit zusammengesetzten Schlüsseln in relationalen Datenbanken.
Typ und Codierung für strukturierte Zeilenschlüssel werden durch ein Zeilenschlüsselschema definiert, das Sie optional einer Bigtable-Tabelle hinzufügen können. Strukturierte Zeilenschlüsseldaten werden als Byte gespeichert. GoogleSQL für Bigtable verwendet jedoch automatisch den Typ und die Codierung, die im Zeilenschlüsselschema definiert sind, wenn Sie eine SQL-Abfrage für die Tabelle ausführen.
Die Verwendung eines Zeilenschlüssel-Schemas zum Abfragen einer Tabelle mit einer ReadRows
-Anfrage wird nicht unterstützt. Eine kontinuierliche materialisierte Ansicht hat standardmäßig ein Zeilenschlüssel-Schema. Weitere Informationen zu strukturierten Zeilenschlüsseln finden Sie unter Schemas für Zeilenschlüssel verwalten.
Nicht erzwungene Typen
Wenn keine Typinformationen angegeben sind, behandelt Bigtable jede Zelle als Byte mit einer unbekannten Codierung.
Wenn Sie Spaltenfamilien abfragen, die ohne Typerzwingung erstellt wurden, müssen Sie zur Lesezeit Typinformationen angeben, damit die Daten richtig gelesen werden. Das ist bei Datenbankfunktionen relevant, deren Verhalten vom Datentyp abhängt. GoogleSQL for Bigtable bietet CAST-Funktionen für Typkonvertierungen zur Abfragezeit. Mit diesen Funktionen werden Bytes in die Typen konvertiert, die von verschiedenen Funktionen erwartet werden.
Bigtable erzwingt zwar keine Typen, bei bestimmten Vorgängen wird jedoch ein Datentyp vorausgesetzt. So können Sie sicherstellen, dass Ihre Daten so geschrieben werden, dass sie in der Datenbank verarbeitet werden können. Hier einige Beispiele:
- Bei Inkrementen mit
ReadModifyWriteRow
wird davon ausgegangen, dass die Zelle eine vorzeichenbehaftete 64-Bit-Ganzzahl im Big-Endian-Format enthält. - Die Funktion
TO_VECTOR64
in SQL erwartet, dass die Zelle ein Byte-Array enthält, das eine Verkettung der Big-Endian-Bytes von 64-Bit-Gleitkommazahlen ist. - Die Funktion
TO_VECTOR32
in SQL erwartet, dass die Zelle ein Byte-Array enthält, das eine Verkettung der Big-Endian-Bytes von 32-Bit-Gleitkommazahlen ist.