אופטימיזציה של הביצועים של BigQuery DataFrames
בעזרת BigQuery DataFrames אפשר לנתח ולשנות נתונים ב-BigQuery באמצעות ממשק API שתואם ל-pandas. כדי לעבד את הנתונים מהר יותר ובצורה חסכונית יותר, אפשר להשתמש בכמה טכניקות לשיפור הביצועים.
במסמך הזה מפורטות הדרכים הבאות לשיפור הביצועים:
- שימוש במצב של סדר חלקי.
- שמירת תוצאות במטמון אחרי פעולות יקרות.
- צפייה בתצוגה מקדימה של הנתונים באמצעות השיטה
peek(). - דחיית
repr()אחזור הנתונים.
שימוש במצב של סדר חלקי
ל-BigQuery DataFrames יש תכונה של מצב סידור, שמכתיבה סדר שורות ספציפי לפעולות כמו פונקציות חלון וצירופים. אפשר לציין את מצב ההזמנה על ידי הגדרת המאפיין ordering_mode לערך strict (שנקרא מצב הזמנה מחמיר, שהוא ברירת המחדל) או לערך partial (שנקרא מצב הזמנה חלקי). השימוש בהגדרה partial יכול לשפר את היעילות של השאילתות.
מצב הזמנה חלקי שונה ממצב הזמנה מדויק. במצב 'סדר קפדני' כל השורות מסודרות בסדר מסוים. הסדר הכולל הזה משפר את העבודה של BigQuery DataFrames עם pandas, ומאפשר לכם לגשת לשורות לפי הסדר שלהן באמצעות המאפיין DataFrame.iloc. עם זאת, המיון הכולל ומדד הרצף שמוגדר כברירת מחדל מונעים ממסננים בעמודות או בשורות להקטין את כמות הנתונים שנסרקים. הסינון הזה מתבצע אלא אם אתם משתמשים במסננים האלה כפרמטרים בפונקציות read_gbq ו-read_gbq_table. כדי להזמין את כל השורות ב-DataFrame, BigQuery DataFrames יוצר גיבוב של כל השורות. הפעולה הזו יכולה לגרום לסריקה מלאה של הנתונים, שתתעלם ממסנני שורות ועמודות.
מצב הזמנה חלקית מונע מ-BigQuery DataFrames ליצור סדר כולל לכל השורות, ומשבית תכונות שדורשות סדר כולל, כמו המאפיין DataFrame.iloc. במצב של סידור חלקי, הסיווג DefaultIndexKind מוגדר לאינדקס null, במקום לאינדקס רציף.
כשמסננים אובייקט DataFrame באמצעות מצב של סדר חלקי, ספריות BigQuery DataFrames לא מחשבות אילו שורות חסרות באינדקס הרציף. בנוסף, במצב של סדר חלקי, הנתונים לא משולבים באופן אוטומטי על סמך האינדקס. הגישות האלה יכולות לשפר את היעילות של השאילתות.
עם זאת, בין אם משתמשים במצב ברירת המחדל של סדר קפדני או במצב של סדר חלקי, BigQuery DataFrames API פועל כמו pandas API המוכר.
בשני מצבי ההזמנה, החלקי והמוקפד, אתם משלמים על המשאבים של BigQuery שבהם אתם משתמשים. עם זאת, שימוש במצב של סידור חלקי יכול להוזיל את העלויות כשעובדים עם טבלאות גדולות שמחולקות למחיצות ומקובצות. הפחתת העלות הזו מתרחשת כי מסנני שורות בעמודות של אשכולות ומחיצות מפחיתים את כמות הנתונים שעוברת עיבוד.
הפעלת מצב הזמנה חלקית
כדי להשתמש בסדר חלקי, צריך להגדיר את המאפיין ordering_mode לערך partial לפני שמבצעים פעולות אחרות עם BigQuery DataFrames, כמו שמוצג בדוגמת הקוד הבאה:
מצב סידור חלקי מונע הצטרפות מרומזת של אובייקטים לא קשורים של BigQuery DataFrames כי אין להם אינדקס רציף.
במקום זאת, צריך לקרוא באופן מפורש לשיטה DataFrame.merge כדי לצרף שני אובייקטים של BigQuery DataFrames שמקורם בביטויי טבלה שונים.
התכונות Series.unique() ו-Series.drop_duplicates() לא פועלות במצב של סידור חלקי. במקום זאת, משתמשים בשיטה groupby כדי למצוא ערכים ייחודיים, כמו בדוגמה הבאה:
במצב של סדר חלקי, הפלט של הפונקציות DataFrame.head(n) ו-Series.head(n) עשוי להיות שונה בכל הרצה. כדי להוריד דגימה קטנה ואקראית של הנתונים, משתמשים בשיטות DataFrame.peek() או Series.peek().
תוכלו לעיין במדריך מפורט שבו נעשה שימוש במאפיין ordering_mode = "partial"
במאמר ניתוח הורדות של חבילות מ-PyPI באמצעות BigQuery DataFrames.
פתרון בעיות
מכיוון שלפעמים חסר סדר או אינדקס ב-BigQuery DataFrames במצב של סדר חלקי, יכול להיות שתיתקלו בבעיות הבאות כשמשתמשים בשיטות מסוימות שתואמות ל-pandas.
שגיאה שנדרשת הזמנה
כדי להשתמש בחלק מהתכונות, כמו הפונקציות DataFrame.head() ו-DataFrame.iloc, צריך להגדיר סדר. רשימת התכונות שנדרש להן סדר מופיעה בעמודה Requires
ordering (נדרש סדר) במאמר ממשקי API נתמכים של pandas.
אם לא מוגדר סדר לאובייקט, הפעולה תיכשל ותוצג הודעה כמו הבאה: OrderRequiredErrorOrderRequiredError: Op iloc
requires an ordering. Use .sort_values or .sort_index to provide an ordering.
כפי שמצוין בהודעת השגיאה, אפשר להשתמש בשיטה DataFrame.sort_values() כדי למיין לפי עמודה אחת או יותר. שיטות אחרות, כמו DataFrame.groupby(), מספקות באופן מרומז סדר כולל על סמך המפתחות של הקיבוץ לפי.
בניגוד ל-pandas, אם אתם במצב של סדר חלקי, הפעלת אותו קוד עשויה להניב תוצאות שונות בכל הפעלה. כדי לקבל תוצאות עקביות, צריך להשתמש בסדר כולל קבוע לכל השורות.
שגיאה באינדקס Null
כדי להשתמש בחלק מהתכונות, כמו המאפיינים DataFrame.unstack() ו-Series.interpolate(), צריך ליצור אינדקס. רשימת התכונות שמחייבות אינדקס מופיעה בעמודה Requires index בטבלה Supported pandas APIs.
כשמשתמשים בפעולה שדורשת אינדקס עם מצב סידור חלקי, הפעולה מעלה הודעת NullIndexError כמו הבאה:
NullIndexError: DataFrame cannot perform interpolate as it has no index.
Set an index using set_index.
כפי שכתוב בהודעת השגיאה, אפשר לספק אינדקס באמצעות השיטה DataFrame.set_index() כדי למיין לפי עמודה אחת או יותר. שיטות אחרות, כמו DataFrame.groupby(), מספקות באופן מרומז אינדקס שמבוסס על המפתחות של ה-קיבוץ לפי, אלא אם הפרמטר as_index=False מוגדר.
שמירת תוצאות במטמון אחרי פעולות יקרות
BigQuery DataFrames מאחסן פעולות באופן מקומי ודוחה את הרצת השאילתות עד שמתקיימים תנאים מסוימים. כתוצאה מכך, אותן פעולות יכולות לפעול כמה פעמים בשאילתות שונות.
כדי להימנע מחזרה על פעולות יקרות, כדאי לשמור תוצאות ביניים באמצעות המתודה cache(), כמו בדוגמה הבאה:
בשיטה הזו נוצרת טבלה זמנית ב-BigQuery לאחסון התוצאות. החיוב על האחסון של הטבלה הזמנית הזו מתבצע ב-BigQuery.
תצוגה מקדימה של הנתונים באמצעות השיטה peek()
ב-BigQuery DataFrames יש שתי שיטות API לתצוגה מקדימה של נתונים:
-
peek(n)מחזירהnשורות של נתונים, כאשרnהוא מספר השורות. -
head(n)מחזירה אתnהשורות הראשונות של הנתונים, בהתאם להקשר, כאשרnהוא מספר השורות.
משתמשים בשיטה head() רק כשהסדר של הנתונים חשוב, למשל כשרוצים את חמשת הערכים הגדולים ביותר בעמודה. במקרים אחרים, כדאי להשתמש בשיטה peek() כדי לאחזר נתונים בצורה יעילה יותר, כמו שמוצג בדוגמת הקוד הבאה:
אפשר גם להשתמש בשיטה peek() כדי להוריד מדגם קטן ואקראי של נתונים בזמן שמשתמשים במצב של סידור חלקי.
דחיית אחזור הנתונים של repr()
אפשר לקרוא לשיטה repr() ב-BigQuery DataFrames באמצעות מחברות או מאתר הבאגים של סביבת הפיתוח המשולבת. הקריאה הזו מפעילה את הקריאה head() שמחלצת את הנתונים בפועל. השליפה הזו עלולה להאט את תהליך הקידוד והניפוי באגים האיטרטיבי, וגם לגרום לעלויות.
כדי למנוע מהשיטה repr() לאחזר נתונים, מגדירים את המאפיין repr_mode לערך "deferred", כמו בדוגמה הבאה:
במצב דחוי, אפשר לראות תצוגה מקדימה של הנתונים רק באמצעות קריאות מפורשות של peek() ושל head().
המאמרים הבאים
- מידע נוסף על BigQuery DataFrames
- איך יוצרים ויזואליזציה של BigQuery DataFrames
- אפשר לעיין במאמרי העזרה של ה-API של BigQuery DataFrames.
- אפשר לראות את קוד המקור, מחברות לדוגמה ודוגמאות של BigQuery DataFrames ב-GitHub.