שימוש במערכת סוגי הנתונים של 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() |
| Float | FLOAT64 |
pandas.Float64Dtype() |
float |
float64() |
| String | 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 | NUMERIC |
pandas.ArrowDtype(pyarrow.decimal128(38, 9)) |
decimal.Decimal |
decimal128(38, 9) |
| מספר גדול | 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()) בגרסה 3.0 ואילך של pandas ובגרסה 19.0 ואילך של PyArrow. אחרת, עמודות 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 כדי להראות שבניגוד לספריית התאריכים והשעות של Python, שמחזירה עדיין מופע של תאריך, BigQuery DataFrames פועל לפי ההתנהגות של PyArrow ומחזיר מופע של חותמת זמן:
סוגים מיוחדים
בקטעים הבאים מתוארים סוגי הנתונים המיוחדים שבהם נעשה שימוש ב-BigQuery DataFrames.
JSON
ב-BigQuery DataFrames, עמודות שמשתמשות בפורמט JSON של BigQuery (תקן קל משקל) מיוצגות על ידי pandas.ArrowDtype. סוג החץ הבסיסי המדויק תלוי בגרסאות של הספריות. בסביבות ישנות יותר נעשה בדרך כלל שימוש ב-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 DataFrames ו-Series, כמו שמוצג בדוגמה הבאה:
שלא כמו בספריית pandas, ב-BigQuery DataFrames יש תמיכה רק בערכי timedelta עם דיוק של מיקרו-שנייה. אם הנתונים כוללים ננו-שניות, צריך לעגל אותן כדי למנוע חריגים פוטנציאליים, כמו בדוגמה הבאה:
אפשר להשתמש בפונקציה bigframes.pandas.to_timedelta כדי להמיר אובייקט של BigQuery DataFrames Series לסוג timedelta, כמו בדוגמה הבאה:
כשאתם טוענים נתונים שמכילים ערכים של timedelta לטבלה ב-BigQuery, הערכים האלה מומרים למיקרו-שניות ומאוחסנים בעמודות INT64. כדי לשמור את פרטי הסוג, אפליקציית BigQuery DataFrames מוסיפה את המחרוזת #microseconds לתיאורים של העמודות האלה. חלק מהפעולות, כמו הפעלת שאילתות SQL וקריאות ל-UDF, לא שומרות את תיאורי העמודות, ופרטי הסוג timedelta אובדים אחרי שהפעולות האלה מסתיימות.
כלים לסוגים מורכבים
לסוגים מורכבים מסוימים, BigQuery DataFrames מספק כלים שמאפשרים לכם לגשת לערכים האלמנטריים בתוך הסוגים האלה ולעבד אותם.
List accessor
אובייקט ListAccessor יכול לעזור לכם לבצע פעולות על כל רכיב ברשימה באמצעות מאפיין הרשימה של אובייקט Series, כמו בדוגמה הבאה:
Struct accessor
אובייקט StructAccessor יכול לגשת לשדות ולעבד אותם בסדרה של מבנים. אובייקט הגישה ל-API הוא series.struct, כמו בדוגמה הבאה:
אם השדה struct שאתם מתכננים לגשת אליו לא משתמע לשתי פנים בהשוואה למאפיינים אחרים של Series, אתם יכולים לדלג על הקריאה ל-struct, כמו בדוגמה הבאה:
עם זאת, מומלץ להשתמש ב-struct כדי לגשת לשדות, כי כך קל יותר להבין את הקוד ופחות סביר שיהיו בו שגיאות.
פונקציית accessor למחרוזת
אפשר לגשת לאובייקט StringAccessor באמצעות המאפיין str באובייקט Series, כמו בדוגמה הבאה:
פונקציית גישה למיקום גיאוגרפי
BigQuery DataFrames מספק אובייקט GeographyAccessor שמשתמש בממשקי API דומים למבנה GeoSeries שמסופק על ידי ספריית GeoPandas. אפשר להפעיל את האובייקט GeographyAccessor עם המאפיין geo באובייקט Series, כמו בדוגמה הבאה: