使用 BigQuery DataFrames 資料型別系統
BigQuery DataFrames 資料型別系統是以 BigQuery 資料型別為基礎建構而成。這項設計可確保與Google Cloud 資料倉儲順暢整合及對齊,反映 BigQuery 中用於資料儲存的內建型別。
類型對應
下表列出 BigQuery、BigQuery DataFrames 和其他 Python 程式庫的對等資料類型,以及支援程度:
資料類型 | BigQuery | BigQuery DataFrames | Python 內建函式 | PyArrow |
---|---|---|---|---|
布林值 | BOOL |
pandas.BooleanDtype() |
bool |
bool_() |
整數 | INT64 |
pandas.Int64Dtype() |
int |
int64() |
浮點值 | FLOAT64 |
pandas.Float64Dtype() |
float |
float64() |
字串 | STRING |
pandas.StringDtype(storage="pyarrow") |
str |
string() |
位元組 | BYTES |
pandas.ArrowDtype(pyarrow.binary()) |
bytes |
binary() |
日期 | DATE |
pandas.ArrowDtype(pyarrow.date32()) |
datetime.date |
date32() |
時間 | TIME |
pandas.ArrowDtype(pyarrow.time64("us")) |
datetime.time |
time64("us") |
日期時間 | DATETIME |
pandas.ArrowDtype(pyarrow.timestamp("us")) |
datetime.datetime |
timestamp("us") |
時間戳記 | TIMESTAMP |
pandas.ArrowDtype(pyarrow.timestamp("us", tz="UTC")) |
Datetime.datetime 包含時區 |
timestamp("us", tz="UTC") |
數字 | NUMERIC |
pandas.ArrowDtype(pyarrow.decimal128(38, 9)) |
decimal.Decimal |
decimal128(38, 9) |
大字編號 | BIGNUMERIC |
pandas.ArrowDtype(pyarrow.decimal256(76, 38)) |
decimal.Decimal |
decimal256(76, 38) |
清單 |
ARRAY <T> |
pandas.ArrowDtype(pyarrow.list_(T)) |
list[T] |
list_(T) |
結構 | STRUCT |
pandas.ArrowDtype(pyarrow.struct()) |
dict |
struct() |
JSON | JSON |
pandas.ArrowDtype(pyarrow.json_(pa.string()) (適用於 pandas 3.0 以上版本和 PyArrow 19.0 以上版本)。否則,JSON 欄會顯示為 pandas.ArrowDtype(db_dtypes.JSONArrowType()) 。這項功能目前為預先發布版。 |
不支援 | json_() (預覽) |
地理位置 | GEOGRAPHY |
Geopandas.array.GeometryDtype() 僅支援 to_pandas() 。 |
不支援 | 不支援 |
Timedelta | 不支援 | pandas.ArrowDtype(pyarrow.duration("us")) |
datetime.timedelta |
duration("us") |
類型轉換
搭配本機資料使用時,BigQuery DataFrames 會在定義類型對應的任何位置,將資料類型轉換為對應的 BigQuery DataFrames 等效類型,如下例所示:
如果資料型別對等項目之間有差異,PyArrow 會決定行為。在極少數情況下,Python 內建型別的運作方式與 PyArrow 對應項目不同,為確保一致性,BigQuery DataFrames 通常會採用 PyArrow 行為。
下列程式碼範例使用 datetime.date + timedelta
運算,說明 BigQuery DataFrames 會遵循 PyArrow 行為,傳回時間戳記例項,這與仍會傳回日期例項的 Python datetime 程式庫不同:
特殊類型
以下各節說明 BigQuery DataFrame 使用的特殊資料型別。
JSON
在 BigQuery DataFrames 中,使用 BigQuery JSON 格式 (輕量級標準) 的資料欄會以 pandas.ArrowDtype
表示。確切的基礎 Arrow 型別取決於程式庫版本。舊版環境通常會使用 db_dtypes.JSONArrowType()
進行相容性作業,這是 Arrow 擴充功能型別,可做為 pa.string()
的輕量包裝函式。相較之下,較新的設定 (pandas 3.0 以上版本和 PyArrow 19.0 以上版本) 會使用較新的 pa.json_(pa.string())
表示法。
timedelta
timedelta
型別在 BigQuery 原生型別系統中沒有直接對應的型別。為管理時間長度資料,BigQuery DataFrames 會使用 INT64
型別做為 BigQuery 資料表中的基礎儲存格式。您可以預期計算結果會與使用 pandas 程式庫執行同等作業時的行為一致。
您可以將 timedelta
值直接載入 BigQuery DataFrame 和 Series
物件,如下列範例所示:
與 pandas 不同,BigQuery DataFrames 僅支援微秒精確度的 timedelta
值。如果資料包含奈秒,您必須將其四捨五入,以免發生潛在例外狀況,如下列範例所示:
您可以使用 bigframes.pandas.to_timedelta
函式,將 BigQuery DataFrames Series
物件轉換為 timedelta
型別,如下列範例所示:
將含有 timedelta
值的資料載入 BigQuery 資料表時,系統會將這些值轉換為微秒,並儲存在 INT64
資料欄中。為保留類型資訊,BigQuery DataFrames 會在這些資料欄的說明中附加 #microseconds
字串。部分作業 (例如執行 SQL 查詢和叫用 UDF) 不會保留資料欄說明,且完成這些作業後,timedelta
類型資訊會遺失。
複合類型工具
對於特定複合型別,BigQuery DataFrames 提供工具,可讓您存取及處理這些型別中的基本值。
清單存取子
如以下範例所示,您可以使用 ListAccessor
物件的清單屬性,對每個清單元素執行作業:Series
結構存取子
StructAccessor
物件可以存取及處理一系列結構體中的欄位。API 存取子物件為 series.struct
,如下列範例所示:
如果您要存取的 struct
欄位與其他 Series
屬性明確無關,可以略過呼叫 struct
,如以下範例所示:
不過,最佳做法是使用 struct
存取欄位,因為這樣程式碼會更容易理解,也比較不容易出錯。
字串存取子
您可以透過 Series
物件的 str
屬性存取 StringAccessor
物件,如以下範例所示:
地理位置存取子
BigQuery DataFrames 提供 GeographyAccessor
物件,與 GeoPandas 程式庫提供的 GeoSeries 結構共用類似的 API。您可以在 Series
物件上使用 geo
屬性叫用 GeographyAccessor
物件,如下列範例所示: