Datentyp-Erzwingung 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 Typ.
Erzwungene Typen
Der Datentyp wird für die folgenden Daten erzwungen:
- Aggregatspaltenfamilien (Zähler)
- Zeitstempel
- Materialisierte Ansichten
Aggregate
Für den Datentyp Aggregat hängt die Codierung vom Aggregationstyp ab. Wenn Sie eine Aggregatspaltenfamilie 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 Aggregatzellen mit SQL abfragen, werden Typinformationen automatisch in SQL aufgenommen.
Wenn Sie die Daten in Aggregatzellen mit der Methode ReadRows 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 Byte zuzuordnen.
Sie können eine Spaltenfamilie, die keine Aggregatdaten enthält, nicht in eine Aggregatspaltenfamilie umwandeln. Spalten in Aggregatspaltenfamilien dürfen keine Nicht-Aggregatzellen enthalten und Standardspaltenfamilien dürfen keine Aggregatzellen enthalten.
Weitere Informationen zum Erstellen von Tabellen mit Aggregatspaltenfamilien finden Sie unter Tabelle erstellen. Codebeispiele die zeigen, wie Sie eine Aggregatzelle mit codierten Werten erhöhen, finden Sie unter Wert erhöhen.
Zeitstempel
Jede Bigtable-Zelle hat einen Int64-Zeitstempel, der ein Mikrosekundenwert mit maximal Millisekunden-Genauigkeit sein muss. Bigtable lehnt einen Zeitstempel mit Mikrosekunden-Genauigkeit ab, z. B. 3023483279876543. 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. Die Daten in einer materialisierten Ansicht werden basierend auf der Abfrage typisiert, die sie definiert. Eine Übersicht finden Sie unter Kontinuierliche
materialisierte Ansichten.
Wenn Sie eine kontinuierliche materialisierte Ansicht mit SQL abfragen, werden Typinformationen automatisch in SQL aufgenommen.
Wenn Sie Daten aus einer kontinuierlichen materialisierten Ansicht mit einer ReadRows
ReadRows Anfrage der Data API lesen, müssen Sie den Typ jeder Spalte kennen und ihn 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 auf Ihre Daten mit mehrspaltigen Schlüsseln zugreifen, ähnlich wie bei zusammengesetzten Schlüsseln in relationalen Datenbanken.
Der Typ und die 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üsselschemas zum Abfragen einer Tabelle mit einer ReadRows-Anfrage wird nicht unterstützt. Eine kontinuierliche materialisierte Ansicht hat standardmäßig ein Zeilenschlüsselschema. Weitere Informationen zu strukturierten Zeilenschlüsseln finden Sie unter Zeilenschlüsselschemas 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 Typ-Erzwingung erstellt wurden, müssen Sie zur Lesezeit Typinformationen angeben, damit die Daten korrekt gelesen werden. Dies ist bei Datenbankfunktionen relevant, deren Verhalten vom Datentyp abhängt. GoogleSQL für Bigtable bietet CAST Funktionen, um Typkonvertierungen zur Abfragezeit durchzuführen. Mit diesen Funktionen werden Byte in die Typen konvertiert, die von verschiedenen Funktionen erwartet werden.
Obwohl Bigtable keine Typen erzwingt, wird bei bestimmten Vorgängen ein Datentyp vorausgesetzt. Wenn Sie dies wissen, können Sie sicherstellen, dass Ihre Daten so geschrieben werden, dass sie in der Datenbank verarbeitet werden können. Hier einige Beispiele:
- Bei Erhöhungen mit
ReadModifyWriteRowwird davon ausgegangen, dass die Zelle eine vorzeichenbehaftete 64-Bit-Ganzzahl im Big-Endian-Format enthält. - Die Funktion
TO_VECTOR64in SQL erwartet, dass die Zelle ein Byte-Array enthält, das eine Verkettung der Big-Endian-Byte von 64-Bit-Gleitkommazahlen ist. - Die Funktion
TO_VECTOR32in SQL erwartet, dass die Zelle ein Byte-Array enthält, das eine Verkettung der Big-Endian-Byte von 32-Bit-Gleitkommazahlen ist.