שימוש בספריות Python בקוד פתוח

אתם יכולים לבחור מבין שלוש ספריות Python ב-BigQuery, בהתאם לתרחיש השימוש שלכם.

תרחיש לדוגמה תחזוקה על ידי תיאור
‫BigQuery DataFrames עיבוד נתונים ופעולות של למידת מכונה (ML) מבוססי Python עם עיבוד בצד השרת (לדוגמה, באמצעות משבצות זמן) Google ממשקי API של Pandas ו-Scikit learn שהוטמעו באמצעות pushdown בצד השרת. מידע נוסף זמין במאמר מבוא ל-BigQuery DataFrames.
pandas-gbq עיבוד נתונים מבוסס Python באמצעות העתקת נתונים בצד הלקוח ספרייה בקוד פתוח שמתוחזקת על ידי PyData ותורמים מתנדבים מאפשר להעביר נתונים אל ומ-Python DataFrames בצד הלקוח. מידע נוסף זמין במסמכי התיעוד ובקוד המקור.
google-cloud-bigquery פריסה, ניהול ושאילתות מבוססות SQL ב-BigQuery ספרייה בקוד פתוח שמתוחזקת על ידי Google חבילת Python שעוטפת את כל ממשקי BigQuery API. מידע נוסף זמין במסמכי התיעוד ובקוד המקור.

שימוש ב-pandas-gbq וב-google-cloud-bigquery

ספריית pandas-gbq מספקת ממשק פשוט להרצת שאילתות ולהעלאה של מסגרות נתונים של pandas ל-BigQuery. הוא עוטף את ספריית הלקוח של BigQuery,‏ google-cloud-bigquery. שתי הספריות האלה מתמקדות בעזרה בניתוח נתונים באמצעות SQL.

התקנת הספריות

כדי להשתמש בדוגמאות הקוד במדריך הזה, צריך להתקין את חבילת pandas-gbq ואת ספריות הלקוח של BigQuery Python.

מתקינים את החבילות pandas-gbq ו-google-cloud-bigquery.

pip install --upgrade pandas-gbq 'google-cloud-bigquery[bqstorage,pandas]'

הרצת שאילתות

שתי הספריות תומכות בשליפת נתונים שמאוחסנים ב-BigQuery. ההבדלים העיקריים בין הספריות:

pandas-gbq google-cloud-bigquery
תחביר SQL שמוגדר כברירת מחדל ‫GoogleSQL (ניתן להגדרה באמצעות pandas_gbq.context.dialect) GoogleSQL
הגדרות שאילתה נשלח כמילון בפורמט של בקשת שאילתה. משתמשים במחלקה QueryJobConfig, שמכילה מאפיינים לאפשרויות ההגדרה השונות של ה-API.

שאילתות נתונים באמצעות תחביר GoogleSQL

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

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = pandas.read_gbq(sql, dialect="standard")

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = pandas.read_gbq(sql, project_id=project_id, dialect="standard")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = client.query(sql).to_dataframe()

# Run a Standard SQL query with the project set explicitly
project_id = "your-project-id"
df = client.query(sql, project=project_id).to_dataframe()

הרצת שאילתות על נתונים באמצעות תחביר SQL מדור קודם

בדוגמה הבאה אפשר לראות איך מריצים שאילתה באמצעות תחביר SQL מדור קודם. במדריך להעברת נתונים ל-GoogleSQL מוסבר איך לעדכן את השאילתות ל-GoogleSQL.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""

df = pandas.read_gbq(sql, dialect="legacy")

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""
query_config = bigquery.QueryJobConfig(use_legacy_sql=True)

df = client.query(sql, job_config=query_config).to_dataframe()

שימוש ב-BigQuery Storage API להורדת תוצאות גדולות

אפשר להשתמש ב-BigQuery Storage API כדי להוריד תוצאות גדולות במהירות גבוהה פי 15 עד 31.

pandas-gbq:

import pandas

sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# Use the BigQuery Storage API to download results more quickly.
df = pandas.read_gbq(sql, dialect="standard", use_bqstorage_api=True)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = "SELECT * FROM `bigquery-public-data.irs_990.irs_990_2012`"

# The client library uses the BigQuery Storage API to download results to a
# pandas dataframe if the API is enabled on the project, the
# `google-cloud-bigquery-storage` package is installed, and the `pyarrow`
# package is installed.
df = client.query(sql).to_dataframe()

הרצת שאילתה עם הגדרה

כדי לבצע פעולות מורכבות מסוימות, כמו הפעלת שאילתה עם פרמטרים או ציון טבלת יעדים לאחסון תוצאות השאילתה, צריך לשלוח הגדרה עם בקשת BigQuery API. ב-pandas-gbq, צריך לשלוח את ההגדרה כמילון בפורמט של בקשת שאילתה. ב-google-cloud-bigquery, יש מחלקות הגדרות של משימות, כמו QueryJobConfig, שמכילות את המאפיינים הדרושים להגדרת משימות מורכבות.

בדוגמה הבאה אפשר לראות איך מריצים שאילתה עם פרמטרים בעלי שמות.

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = {
    "query": {
        "parameterMode": "NAMED",
        "queryParameters": [
            {
                "name": "state",
                "parameterType": {"type": "STRING"},
                "parameterValue": {"value": "TX"},
            },
            {
                "name": "limit",
                "parameterType": {"type": "INTEGER"},
                "parameterValue": {"value": 100},
            },
        ],
    }
}

df = pandas.read_gbq(sql, configuration=query_config)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ScalarQueryParameter("state", "STRING", "TX"),
        bigquery.ScalarQueryParameter("limit", "INTEGER", 100),
    ]
)

df = client.query(sql, job_config=query_config).to_dataframe()

טעינת pandas DataFrame לטבלה ב-BigQuery

שתי הספריות תומכות בהעלאת נתונים מ-pandas DataFrame לטבלה חדשה ב-BigQuery. בין ההבדלים העיקריים:

pandas-gbq google-cloud-bigquery
תמיכה בהקלדה הפונקציה ממירה את DataFrame לפורמט CSV לפני השליחה ל-API, שלא תומך בערכים מקוננים או בערכי מערך. הפונקציה ממירה את DataFrame לפורמט Parquet או CSV לפני השליחה ל-API, שתומך בערכים מקוננים ובערכי מערך. בוחרים ב-Parquet לערכי struct ומערך, וב-CSV לערכי תאריך ושעה כדי לקבל גמישות בסריאליזציה. ‫Parquet היא אפשרות ברירת המחדל. שימו לב שצריך להתקין את pyarrow, מנוע ה-parquet שמשמש לשליחת נתוני ה-DataFrame אל BigQuery API, כדי לטעון את ה-DataFrame לטבלה.
טעינת הגדרות אפשר גם לציין סכימת טבלה. משתמשים במחלקה LoadJobConfig, שמכילה מאפיינים לאפשרויות ההגדרה השונות של ה-API.

pandas-gbq:

import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
table_id = "my_dataset.new_table"

df.to_gbq(table_id)

google-cloud-bigquery:

חבילת google-cloud-bigquery דורשת את הספרייה pyarrow כדי לבצע סריאליזציה של pandas DataFrame לקובץ Parquet.

מתקינים את חבילת pyarrow:

 pip install pyarrow

from google.cloud import bigquery
import pandas

df = pandas.DataFrame(
    {
        "my_string": ["a", "b", "c"],
        "my_int64": [1, 2, 3],
        "my_float64": [4.0, 5.0, 6.0],
        "my_timestamp": [
            pandas.Timestamp("1998-09-04T16:03:14"),
            pandas.Timestamp("2010-09-13T12:03:45"),
            pandas.Timestamp("2015-10-02T16:00:00"),
        ],
    }
)
client = bigquery.Client()
table_id = "my_dataset.new_table"
# Since string columns use the "object" dtype, pass in a (partial) schema
# to ensure the correct BigQuery data type.
job_config = bigquery.LoadJobConfig(
    schema=[
        bigquery.SchemaField("my_string", "STRING"),
    ]
)

job = client.load_table_from_dataframe(df, table_id, job_config=job_config)

# Wait for the load job to complete.
job.result()

תכונות שלא נתמכות ב-pandas-gbq

ספריית pandas-gbq מספקת ממשק שימושי לשליחת שאילתות לגבי נתונים ולכתיבת נתונים לטבלאות, אבל היא לא כוללת הרבה מהתכונות של BigQuery API, כולל, בין היתר:

פתרון בעיות בחיבורים

מחרוזת שגיאה: Connection pool is full, discarding connection: bigquery.googleapis.com. Connection pool size: 10

אם משתמשים באובייקט ברירת המחדל של לקוח BigQuery ב-Python, אפשר להשתמש ב-10 שרשורים לכל היותר, כי גודל ברירת המחדל של מאגר השרשורים ב-Python HTTPAdapter הוא 10. כדי להשתמש ביותר מ-10 חיבורים, צריך ליצור אובייקט מותאם אישית.requests.adapters.HTTPAdapter לדוגמה:

client = bigquery.Client()
adapter = requests.adapters.HTTPAdapter(pool_connections=128,
pool_maxsize=128,max_retries=3)
client._http.mount("https://",adapter)
client._http._auth_request.session.mount("https://",adapter)
query_job = client.query(QUERY)