UDF חזיר אפאצ'י: חלק 2 - פונקציות טעינה



פוסט זה מתאר אודות Apache חזיר UDF - פונקציות טעינה. (Apache חזיר UDF: חלק 2). תסתכל על פונקציות הטעינה של Apache חזיר UDF.

הפוסט של היום עוסק בפונקציות Load ב- Apache Pig. זה ההמשך ל פוסט ראשון אשר כיסה פונקציות UDF כמו Eval, Filter ו- Aggregate. אנא פנה אליהם לקבלת מידע נוסף על פונקציות אחרות של UDF חזיר.





פונקציית העומס של חזיר בנויה על גבי InputFormat של Hadoop, המחלקה בה Hadoop משתמש לקריאת נתונים. ל- InputFormat שתי מטרות: היא קובעת כיצד הקלט יתפרק בין משימות המפה ומספקת RecordReader המביאה לזוגות ערכי מפתח כקלט למשימות המפה האלה. מחלקת הבסיס לפונקציית העומס היא LoadFunc.

כיצד ללמוד pl sql

פונקציית עומס - סיווג:

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



  • LoadMetadata:

ל- LoadMetadata יש שיטות להתמודד עם מטא נתונים. רוב הביצועים של מעמיסים אינם צריכים ליישם זאת אלא אם כן הם מתקשרים עם מערכת מטה-נתונים. שיטת getSchema () בממשק זה מציעה דרך ליישומי המטעין לתקשר על סכימת הנתונים חזרה לחזיר. אם יישום מטעין מחזיר נתונים המורכבים משדות מסוגים אמיתיים, עליו לספק את הסכימה המתארת ​​את הנתונים המוחזרים בשיטת getSchema (). השיטות האחרות עוסקות בסוגים אחרים של מטא-נתונים כמו מפתחות מחיצה וסטטיסטיקה. יישומים יכולים להחזיר ערכי החזרת null לשיטות אלה אם הם אינם תקפים ליישום האחר.

  • LoadPushDown:

ל- LoadPushDown יש שיטות שונות לדחוף פעולות מזמן ריצה חזיר ליישומי מטעין. נכון לעכשיו, רק שיטת pushProjection () נקראת על ידי חזיר כדי לתקשר למעמיס, את השדות המדויקים הנדרשים בסקריפט החזיר. יישום המטעין יכול לבחור להיענות או לא להיענות לבקשה. אם יישום המטעין מחליט להיענות לבקשה, עליו ליישם את LoadPushDown כדי לשפר את ביצועי השאילתות.

  • pushProjection ():

שיטה זו מודיעה ל- LoadFunc, אילו שדות נדרשים בסקריפט החזיר. כך מאפשר ל- LoadFunc לשפר את הביצועים על ידי טעינת השדות הנדרשים בלבד. pushProjection () לוקח 'requiredFieldList'. 'requiredFieldList' נקרא לקריאה בלבד ולא ניתן לשנות אותו על ידי LoadFunc. 'RequiredFieldList' כולל רשימה של 'requiredField', כאשר כל 'requiredField' מציין שדה הנדרש על ידי סקריפט החזיר ומורכב מאינדקס, כינוי, סוג ושדות משנה. חזיר משתמש באינדקס העמודות requiredField.index כדי לתקשר עם LoadFunc לגבי השדות הנדרשים על ידי סקריפט החזיר. אם השדה הנדרש הוא מפה, חזיר יעביר את 'requiredField.subFields' המכיל רשימת מקשים הנדרשת על ידי סקריפטים של חזיר עבור המפה.



  • LoadCaster:

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

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

  • getInputFormat ():

    שיטה זו נקראת על ידי חזיר כדי להשתמש ב- InputFormat על ידי המטעין. השיטות ב- InputFormat נקראות על ידי חזיר באותה צורה כמו Hadoop בתוכנית Java של MapReduce. אם ה- InputFormat הוא ארוז ב- Hadoop, היישום צריך להשתמש בממשק ה- API החדש מבוסס תחת org.apache.hadoop.mapreduce. אם זהו InputFormat מותאם אישית, עדיף להיות מיושם באמצעות ה- API החדש ב- org.apache.hadoop.mapreduce.

  • הזן מיקום():

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

  • preparToRead ():

    בשיטה זו, RecordReader הקשור ל- InputFormat המסופק על ידי LoadFunc מועבר ל- LoadFunc. כעת ניתן להשתמש ב- RecordReader על ידי ההטמעה ב- getNext () כדי להחזיר ציצית המייצגת רשומת נתונים חזרה לחזיר.

  • getNext ():

    המשמעות של getNext () לא השתנתה והיא נקראת על ידי זמן ריצה של חזיר לרכוש את הכפול הבא בנתונים. בשיטה זו, היישום צריך להשתמש ב- RecordReader הבסיסי ולבנות את הטופל לחזרה.

יישומי ברירת מחדל ב- LoadFunc:

שים לב כי יש לבטל את יישומי ברירת המחדל ב- LoadFunc רק בעת הצורך.

  • setUdfContextSignature ():

    שיטה זו תיקרא על ידי חזיר, הן בקצה הקדמי והן בקצה האחורי כדי להעביר חתימה ייחודית למעמיס. ניתן להשתמש בחתימה כדי לאחסן כל מידע ב- UDFContext אשר המטעין צריך לאחסן בין קריאות שיטות שונות בקצה ובקצה האחורי. מקרה שימוש הוא לאחסן את RequiredFieldList שהועבר אליו ב- LoadPushDown.pushProjection (RequiredFieldList) לשימוש בקצה האחורי לפני החזרת צמרות ב- getNext (). ליישום ברירת המחדל ב- LoadFunc יש גוף ריק. שיטה זו תיקרא לפני שיטות אחרות.

  • relativeToAbsolutePath ():

    זמן ריצה של חזיר יקרא לשיטה זו כדי לאפשר למעמיס להמיר מיקום עומס יחסי למיקום מוחלט. יישום ברירת המחדל המסופק ב- LoadFunc מטפל בזה במיקומי FileSystem. אם מקור העומס הוא משהו אחר, יישום המטעין עשוי לבחור לעקוף זאת.

הטמעת המטעין בדוגמה היא מטעין לנתוני טקסט עם תוחם קו כ- '
'ו-' 'כמפריד שדה ברירת מחדל בדומה למעמיס PigStorage הנוכחי בחזיר. היישום משתמש בקלט-פורמט נתמך שקיים Hadoop - TextInputFormat - כ- InputFormat הבסיסי.

מחלקה ציבורית SimpleTextLoader מרחיב את LoadFunc {מוגן RecordReader ב- = null פרטי בתים fieldDel = '' פרטי ArrayList mProtoTuple = null פרטי TupleFactory mTupleFactory = TupleFactory.getInstance () פרטי סופי סטטי int BUFFER_SIZE = 1024 פומבי SimpleTextLoader *) מטעין חזיר המשתמש בתו שצוין כמפריד שדה. * * @ param תוחם * תו בתים בודדים המשמש להפרדת שדות. * ('' הוא ברירת המחדל.) * / public SimpleTextLoader (מפריד מחרוזות) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter. delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' case break 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () case break 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: זרוק חדש RuntimeException ('מפריד לא ידוע' + מפריד)}} אחר {זרוק RuntimeException ('מפריד PigStorage חייב להיות תו יחיד')}} @Override ציבורי Tuple getNext () זורק IOException {נסה {בוליאני notDone = in.nextKeyValue () אם (notDone) {return null} ערך טקסט = (טקסט) in.getCurrentValue () בתים [] buf = value.getBytes () int len ​​= value.getLength () int התחלה = 0 עבור (int i = 0 iיש לך שאלה עבורנו? אנא הזכיר זאת בסעיף ההערות ונחזור אליך. 

פוסטים קשורים: