Polars 2.0: מדוע צירופים (joins) אינם שומרים עוד על סדר השורות שלהם
Polars 2.0 מריץ כברירת מחדל את collect על מנוע סטרימינג.
Polars 2.0 מריץ כברירת מחדל את collect על מנוע סטרימינג. עבור join, group_by ו-unpivot, הגרסה אינה מבטיחה עוד את סדר שורות הקלט אלא אם תגדיר maintain_order או sort באופן מפורש. בהרצה שלנו על polars 2.0.0, join פנימי של 2,000,000 שורות החזיר שורות מחוץ לסדר הקלט כברירת מחדל ושמר על הסדר עם maintain_order מוגדר. הגרסה גם מפעילה out-of-core spilling והופכת את טענות הבנצ'מרק של הספק לשלו.
קראו את המהדורה הכתובה (אנגלית) ↗
מה מכסה הסרטון הזה
- קריאה ל-collect() על שאילתת lazy משתמשת כעת במנוע הסטרימינג כברירת מחדל, אשר אינו מבטיח סדר שורות עבור join, group_by ו-unpivot.
- מדריך המעבר אומר שהסדר אינו עוד הסדר שלפני 2.0 ואינו מובטח; הוא ממליץ על מיון מפורש אם אתה מסתמך עליו.
- בהרצה שלנו, join פנימי כברירת מחדל החזיר סדר קלט False; maintain_order="left_right" על ה-join החזיר True. מכונה אחת, הרצה אחת, צורת join אחת.
- שפיכת Out-of-core מופעלת כברירת מחדל: היא מתחילה בכ-80% מה-RAM, עם תקציב דיסק ברירת מחדל של 64 GB. join ו-group_by מחוץ לליבה נמצאים במפת הדרכים.
- collect_schema() תופס עמודה חסרה לפני קריאת נתונים כלשהם, אך cast שנכשל על ערך אחד בלבד נכשל רק ב-collect().
- השוואת TPC-H ו-TPC-DS היא הרצה של הספק עצמו על נתונים נגזרים, והערת השוליים שלו אומרת שהתוצאות אינן ניתנות להשוואה לבנצ'מרקים רשמיים.
תמליל מתורגם
תורגם מהקריינות המקורית באנגלית. זמינות אודיו וכתוביות נשלטת על ידי YouTube.
מדוע סדר ברירת המחדל השתנה?
0:00 אתה חושב ש-join מחזיר לך שורות בסדר שבו כתבת אותן. Polars 2.0 הפסיק להבטיח זאת, כברירת מחדל, בכוונה. בסרטון זה: מדוע השתנה ברירת המחדל? מה זה קנה? ואיזה מהסקריפטים שלך נשבר ראשון? זהו The Daily Diff, מתחת למכסה המנוע. Polars היא ספריית DataFrame בקוד פתוח: מנוע טבלאות שאתה קורא לו מ-Python,
0:20 עם הליבה שלו כתובה ב-Rust. הוא חופשי תחת רישיון MIT, ואתה מתקין אותו עם pip install polars. פרט אחד קודם. המתג שמחזיר את הסדר הישן הוא ארגומנט ל-join עצמו. אחזור אליו בסוף. מאז 2.0, collect מריץ את מנוע הסטרימינג כברירת מחדל. סטרימינג מחלק את השאילתה לנתחים הרצים במקביל, והנתחים מסיימים כשהם מסיימים.
0:42 עבור join, group by ו-unpivot, הגרסה אינה מבטיחה סדר. מי נפגע ראשון? כל מי שמשווה פלט לקובץ שמור, שורה אחר שורה. בדיקה זו יכולה לעבור במחשב הנייד שלך ולהיכשל במכונה אחרת. הבא, מדריך המעבר.
מה מבטיח מדריך המעבר?
0:57 הוא אומר שסדר השורות המדויק המוצג לעיל אינו מובטח. אז אם אתה מסתמך על הסדר, מיין במפורש. Out-of-core מופעל כברירת מחדל גם כן. הוא מתחיל לשפוך לדיסק בכשמונים אחוזים מה-RAM, עם תקציב של שישים וארבעה גיגה-בייט. Sort, פונקציות חלון וביטויים רבים יכולים כעת לשפוך. Joins ו-group-bys בדרך.
האם הבנצ'מרק קרב הוגן?
1:17 Polars אומרת שהיא מנצחת את DataFusion ו-DuckDB בבנצ'מרקים של TPC-H ו-TPC-DS. המספרים מגיעים מההרצות שלהם, על נתונים נגזרים, והערת השוליים שלהם אומרת שהם אינם ניתנים להשוואה לתוצאות רשמיות. המספרים שלהם אומרים ש-Polars משיגה פי שלושה נקודה שמונה בערך מהירות מ- שישה עשר ליבות למאה תשעים ושתיים, ב-TPC-H. הם גם אומרים שהת'רדים הנוספים של המכונה הגדולה מאטים שאילתות קטנות.
מה אנו רואים כשאנו מריצים אותו?
1:41 הרצנו את אותו join פעמיים על Polars 2.0.0. ההרצה כברירת מחדל מערבבת את השורות. עם הדגל, סדר הקלט נשמר. מצא את ה-joins שמזינים בדיקה. כל join ללא sort אחריו הוא החלטה על סדר שורות שמעולם לא קיבלת. Polars 2.0 מחמיר יותר לגבי סוגים.
האם מחמיר פירושו מוקדם יותר?
1:58 בדיקת הסכימה תופסת עמודה חסרה לפני שנקראים נתונים כלשהם. היא אינה יכולה לתפוס cast שנכשל על שורה אחת, מכיוון ששגיאה זו ממתינה ל- נתונים. עכשיו הלולאה שפתחתי.
איך אני מחזיר את הסדר הישן?
2:08 המתג נמצא על ה-join. הגדר maintain order על ה-join, או הוסף sort אחריו. המדריך מציע את ה-sort. הדגל של ה-join שמר על הסדר בהרצה שלנו, כאשר סדר הצד השמאלי נשמר כ- שמאל, ימין. פסק דין, מתחת למכסה המנוע: NEEDS REVIEW.
מהי פסק הדין?
2:22 הייתי בודק כל join לפני שדרוג. יש לך שאלה בנוגע לזה? שים אותה בתגובות. וזה ה-diff להיום. אני ניקו מ-Axrisi. מזג באחריות.
מקורות
- Release of Polars 2.0Polars (pola.rs)
- Polars 2.0 upgrade guidePolars documentation
- Polars homepagePolars (pola.rs)
- polars-2.0-benchmark repositoryPolars on GitHub
- Release of Polars 2.0 (Hacker News discussion)Hacker News



