BigQuery DataFrames-Datentypsystem verwenden
Mit dem Datentypsystem von BigQuery DataFrames können Sie mit Datenstrukturen arbeiten, die mit integrierten BigQuery-Speichertypen übereinstimmen. Wenn Sie Ihre Analysen auf diesen Datentypen aufbauen, ist eine nahtlose Integration und zuverlässige Typzuordnung in Ihrem Data Warehouse gewährleistet.
Typzuordnungen
In der folgenden Tabelle sind die Datentypentsprechungen in BigQuery, BigQuery DataFrames und anderen Python-Bibliotheken sowie die jeweiligen Unterstützungsstufen aufgeführt:
| Datentyp | BigQuery | BigQuery DataFrames | Python-integriert | PyArrow |
|---|---|---|---|---|
| Boolesch | BOOL |
pandas.BooleanDtype() |
bool |
bool_() |
| Ganzzahl | INT64 |
pandas.Int64Dtype() |
int |
int64() |
| Float | FLOAT64 |
pandas.Float64Dtype() |
float |
float64() |
| String | STRING |
pandas.StringDtype(storage="pyarrow") |
str |
string() |
| Byte | BYTES |
pandas.ArrowDtype(pyarrow.binary()) |
bytes |
binary() |
| Datum | DATE |
pandas.ArrowDtype(pyarrow.date32()) |
datetime.date |
date32() |
| Zeit | TIME |
pandas.ArrowDtype(pyarrow.time64("us")) |
datetime.time |
time64("us") |
| Datum/Uhrzeit | DATETIME |
pandas.ArrowDtype(pyarrow.timestamp("us")) |
datetime.datetime |
timestamp("us") |
| Zeitstempel | TIMESTAMP |
pandas.ArrowDtype(pyarrow.timestamp("us", tz="UTC")) |
Datetime.datetime mit Zeitzone |
timestamp("us", tz="UTC") |
| Numerisch | NUMERIC |
pandas.ArrowDtype(pyarrow.decimal128(38, 9)) |
decimal.Decimal |
decimal128(38, 9) |
| BigNumeric | BIGNUMERIC |
pandas.ArrowDtype(pyarrow.decimal256(76, 38)) |
decimal.Decimal |
decimal256(76, 38) |
| List<T> | ARRAY<T> |
pandas.ArrowDtype(pyarrow.list_(T)) |
list[T] |
list_(T) |
| Struct | STRUCT |
pandas.ArrowDtype(pyarrow.struct()) |
dict |
struct() |
| JSON | JSON |
pandas.ArrowDtype(pyarrow.json_(pa.string()) in Pandas-Version 3.0 oder höher und PyArrow-Version 19.0 oder höher; andernfalls werden JSON-Spalten als pandas.ArrowDtype(db_dtypes.JSONArrowType()) angezeigt. Diese Feature befindet sich im Vorschaumodus. |
Nicht unterstützt | json_() (Vorabversion) |
| Geografie | GEOGRAPHY |
Geopandas.array.GeometryDtype()Wird nur von to_pandas() unterstützt. |
Nicht unterstützt | Nicht unterstützt |
| Timedelta | Nicht unterstützt | pandas.ArrowDtype(pyarrow.duration("us")) |
datetime.timedelta |
duration("us") |
Typkonvertierungen
Bei der Verwendung mit lokalen Daten konvertiert BigQuery DataFrames Datentypen in die entsprechenden BigQuery DataFrames-Äquivalente, sofern eine Typzuordnung definiert ist. Dies wird im folgenden Beispiel gezeigt:
PyArrow bestimmt das Verhalten, wenn es Abweichungen zwischen den Datentypäquivalenten gibt. In seltenen Fällen, in denen sich der integrierte Python-Typ von seinem PyArrow-Äquivalent unterscheidet, bevorzugt BigQuery DataFrames im Allgemeinen das PyArrow-Verhalten, um Konsistenz zu gewährleisten.
Im folgenden Codebeispiel wird der Vorgang datetime.date + timedelta verwendet, um zu zeigen, dass BigQuery DataFrames im Gegensatz zur Python-Bibliothek „datetime“, die immer eine Datumsinstanz zurückgibt, dem PyArrow-Verhalten folgt und eine Zeitstempelinstanz zurückgibt:
Spezielle Typen
In den folgenden Abschnitten werden die speziellen Datentypen beschrieben, die von BigQuery DataFrames verwendet werden.
JSON
In BigQuery DataFrames werden Spalten im JSON-Format von BigQuery (einem einfachen Standard) durch pandas.ArrowDtype dargestellt. Der genaue zugrunde liegende Arrow-Typ hängt von Ihren Bibliotheksversionen ab. Ältere Umgebungen verwenden aus Kompatibilitätsgründen in der Regel db_dtypes.JSONArrowType(). Dies ist ein Arrow-Erweiterungstyp, der als einfacher Wrapper für pa.string() fungiert. Im Gegensatz dazu verwenden neuere Setups (pandas 3.0 und höher sowie PyArrow 19.0 und höher) die neuere pa.json_(pa.string())-Darstellung.
timedelta
Der Typ timedelta hat keine direkte Entsprechung im integrierten BigQuery-Typsystem. Zum Verwalten von Dauerdaten verwendet BigQuery DataFrames den Typ INT64 als zugrunde liegendes Speicherformat in BigQuery-Tabellen. Die Ergebnisse Ihrer Berechnungen sollten mit dem Verhalten übereinstimmen, das Sie von entsprechenden Vorgängen mit der Pandas-Bibliothek erwarten würden.
Sie können timedelta-Werte direkt in BigQuery DataFrames und Series-Objekte laden, wie im folgenden Beispiel gezeigt:
Im Gegensatz zu Pandas unterstützt BigQuery DataFrames nur timedelta-Werte mit Mikrosekunden-Genauigkeit. Wenn Ihre Daten Nanosekunden enthalten, müssen Sie sie runden, um potenzielle Ausnahmen zu vermeiden, wie im folgenden Beispiel gezeigt:
Mit der Funktion bigframes.pandas.to_timedelta können Sie ein BigQuery DataFrames-Series-Objekt in den Typ timedelta umwandeln, wie im folgenden Beispiel gezeigt:
Wenn Sie Daten mit timedelta-Werten in eine BigQuery-Tabelle laden, werden die Werte in Mikrosekunden umgewandelt und in INT64-Spalten gespeichert. Damit die Typinformationen erhalten bleiben, hängt BigQuery DataFrames den String #microseconds an die Beschreibungen dieser Spalten an. Bei einigen Vorgängen wie SQL-Abfrageausführungen und UDF-Aufrufen werden Spaltenbeschreibungen nicht beibehalten und die timedelta-Typinformationen gehen nach Abschluss dieser Vorgänge verloren.
Tools für zusammengesetzte Typen
Für bestimmte zusammengesetzte Typen bietet BigQuery DataFrames Tools, mit denen Sie auf die Elementwerte in diesen Typen zugreifen und sie verarbeiten können.
Listen-Accessor
Mit dem ListAccessor-Objekt können Sie Vorgänge für jedes Listenelement ausführen. Verwenden Sie dazu das Listenattribut des Series-Objekts, wie im folgenden Beispiel gezeigt:
Struct-Accessor
Das StructAccessor-Objekt kann auf Felder in einer Reihe von Structs zugreifen und diese verarbeiten. Das API-Zugriffsobjekt ist series.struct, wie im folgenden Beispiel gezeigt:
Wenn das struct-Feld, auf das Sie zugreifen möchten, eindeutig von anderen Series-Eigenschaften unterscheidbar ist, können Sie den Aufruf von struct überspringen, wie im folgenden Beispiel gezeigt:
Es empfiehlt sich jedoch, struct für den Zugriff auf Felder zu verwenden, da Ihr Code dadurch leichter verständlich und weniger fehleranfällig wird.
String-Zugriffsfunktion
Sie können auf das StringAccessor-Objekt mit der str-Property eines Series-Objekts zugreifen, wie im folgenden Beispiel gezeigt:
Geografie-Accessor
BigQuery DataFrames bietet ein GeographyAccessor-Objekt, das ähnliche APIs wie die GeoSeries-Struktur der GeoPandas-Bibliothek hat. Sie können das GeographyAccessor-Objekt mit dem Attribut geo für ein Series-Objekt aufrufen, wie im folgenden Beispiel gezeigt:
Nächste Schritte
- Informationen zu BigQuery DataFrames
- BigQuery DataFrames-Sitzungen und ‑E/A
- Diagramme mit BigQuery DataFrames visualisieren
- Referenz zur BigQuery DataFrames API