שינוי נתונים באמצעות BigQuery DataFrames

בעזרת BigQuery DataFrames אתם יכולים לשנות נתונים באמצעות תבניות תחביר מוכרות של pandas, בלי להעביר מערכי נתונים מחוץ למחסן הנתונים. הפעולות האלה מבוצעות בצד השרת, אז אתם יכולים לבדוק את הנתונים שמאוחסנים ב-BigQuery, לשנות אותם ולהחיל עליהם חישובים מורכבים ישירות.

מידע נוסף על פונקציות נתמכות זמין בספרייה bigframes.bigquery.

התפקידים הנדרשים

כדי לקבל את ההרשאות שדרושות לביצוע המשימות שמפורטות במאמר הזה, בקשו מהאדמין לתת לכם את התפקידים הבאים ב-IAM ברמת הפרויקט:

להסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.

יכול להיות שאפשר לקבל את ההרשאות הנדרשות גם באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש.

כשמבצעים אימות של משתמשי קצה בסביבה אינטראקטיבית כמו notebook,‏ Python REPL או שורת הפקודה, BigQuery DataFrames מבקש אימות במקרה הצורך. אחרת, תוכלו לקרוא איך מגדירים את Application Default Credentials בסביבות שונות.

pandas API

אחד המאפיינים הבולטים של BigQuery DataFrames הוא ש-ה-API של bigframes.pandas דומה לממשקי ה-API בספריית pandas. העיצוב הזה מאפשר לכם להשתמש בתבניות תחביר מוכרות למשימות של שינוי נתונים. פעולות שמוגדרות באמצעות BigQuery DataFrames API מבוצעות בצד השרת, פועלות ישירות על נתונים שמאוחסנים ב-BigQuery ומבטלות את הצורך להעביר מערכי נתונים מחוץ ל-BigQuery.

כדי לבדוק באילו ממשקי API של pandas יש תמיכה ב-BigQuery DataFrames, קראו את המאמר ממשקי API נתמכים של pandas.

בדיקה ושינוי של נתונים

אתם יכולים להשתמש ב-API של bigframes.pandas כדי לבצע פעולות של בדיקת נתונים וחישוב. דוגמת הקוד הבאה משתמשת בספרייה bigframes.pandas כדי לבדוק את העמודה body_mass_g, לחשב את הממוצע של body_mass ולחשב את הממוצע של body_mass לפי species:

import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Inspect one of the columns (or series) of the DataFrame:
bq_df["body_mass_g"]

# Compute the mean of this series:
average_body_mass = bq_df["body_mass_g"].mean()
print(f"average_body_mass: {average_body_mass}")

# Find the heaviest species using the groupby operation to calculate the
# mean body_mass_g:
(
    bq_df["body_mass_g"]
    .groupby(by=bq_df["species"])
    .mean()
    .sort_values(ascending=False)
    .head(10)
)

ספריית BigQuery

ספריית BigQuery מספקת פונקציות SQL של BigQuery, שיכול להיות שאין להן מקבילה ב-pandas. בקטעים הבאים מוצגות כמה דוגמאות.

עיבוד ערכי מערך

אפשר להשתמש בפונקציה bigframes.bigquery.array_agg() בספרייה bigframes.bigquery כדי לצבור ערכים אחרי פעולת groupby:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

s = bpd.Series([0, 1, 2, 3, 4, 5])

# Group values by whether they are divisble by 2 and aggregate them into arrays
bbq.array_agg(s.groupby(s % 2 == 0))
# False    [1 3 5]
# True     [0 2 4]
# dtype: list<item: int64>[pyarrow]

אפשר גם להשתמש בפונקציות המערך array_length() ו-array_to_string().

יצירת אובייקט struct Series

אפשר להשתמש בפונקציה bigframes.bigquery.struct() בספרייה bigframes.bigquery כדי ליצור אובייקט struct Series חדש עם שדות משנה לכל עמודה ב-DataFrame:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"
bq_df = bpd.read_gbq(query_or_table)

# Create a new STRUCT Series with subfields for each column in a DataFrames.
lengths = bbq.struct(
    bq_df[["culmen_length_mm", "culmen_depth_mm", "flipper_length_mm"]]
)

lengths.peek()
# 146	{'culmen_length_mm': 51.1, 'culmen_depth_mm': ...
# 278	{'culmen_length_mm': 48.2, 'culmen_depth_mm': ...
# 337	{'culmen_length_mm': 36.4, 'culmen_depth_mm': ...
# 154	{'culmen_length_mm': 46.5, 'culmen_depth_mm': ...
# 185	{'culmen_length_mm': 50.1, 'culmen_depth_mm': ...
# dtype: struct[pyarrow]

המרת חותמות זמן לראשית זמן יוניקס (Unix epoch)

אפשר להשתמש בפונקציה bigframes.bigquery.unix_micros() בספרייה bigframes.bigquery כדי להמיר חותמות זמן למיקרו-שניות של Unix:

import pandas as pd

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Create a series that consists of three timestamps: [1970-01-01, 1970-01-02, 1970-01-03]
s = bpd.Series(pd.date_range("1970-01-01", periods=3, freq="d", tz="UTC"))

bbq.unix_micros(s)
# 0               0
# 1     86400000000
# 2    172800000000
# dtype: Int64

אפשר גם להשתמש בפונקציות הזמן unix_seconds() ו-unix_millis().

שימוש בפונקציה הסקלרית של SQL

אתם יכולים להשתמש בפונקציה bigframes.bigquery.sql_scalar() בספרייה bigframes.bigquery כדי לגשת לתחביר SQL שרירותי שמייצג ביטוי של עמודה אחת:

import bigframes.bigquery as bbq
import bigframes.pandas as bpd

# Load data from BigQuery
query_or_table = "bigquery-public-data.ml_datasets.penguins"

# The sql_scalar function can be used to inject SQL syntax that is not supported
# or difficult to express with the bigframes.pandas APIs.
bq_df = bpd.read_gbq(query_or_table)
shortest = bbq.sql_scalar(
    "LEAST({0}, {1}, {2})",
    columns=[
        bq_df["culmen_depth_mm"],
        bq_df["culmen_length_mm"],
        bq_df["flipper_length_mm"],
    ],
)

shortest.peek()
#         0
# 149	18.9
# 33	16.3
# 296	17.2
# 287	17.0
# 307	15.0
# dtype: Float64

המאמרים הבאים