Apache Pig UDF: ตอนที่ 2 - โหลดฟังก์ชั่น



โพสต์นี้อธิบายเกี่ยวกับ Apache Pig UDF - โหลดฟังก์ชัน (Apache Pig UDF: ตอนที่ 2) ดูฟังก์ชั่นการโหลดของ Apache Pig UDF

โพสต์ของวันนี้เกี่ยวกับฟังก์ชั่น Load ใน Apache Pig นี่คือภาคต่อของไฟล์ โพสต์แรก ซึ่งครอบคลุมฟังก์ชัน UDF เช่น Eval, Filter และ Aggregate โปรดตอบกลับพวกเขาสำหรับข้อมูลเพิ่มเติมเกี่ยวกับฟังก์ชั่นอื่น ๆ ของ Pig UDF





ประเภทของตัวกรองในฉาก

ฟังก์ชัน Pig’s load สร้างขึ้นบน Hadoop’s InputFormat ซึ่งเป็นคลาสที่ Hadoop ใช้อ่านข้อมูล InputFormat มีวัตถุประสงค์สองประการ: กำหนดว่าอินพุตจะถูกแยกส่วนระหว่างงานแผนที่อย่างไรและจัดเตรียม RecordReader ที่ส่งผลให้คู่คีย์ - ค่าเป็นอินพุตสำหรับงานแผนที่ คลาสพื้นฐานสำหรับฟังก์ชันโหลดคือ LoadFunc

โหลดฟังก์ชัน - การจำแนกประเภท:

คลาสนามธรรม LoadFunc มีสามวิธีหลักในการโหลดข้อมูลและในกรณีการใช้งานส่วนใหญ่ก็เพียงพอที่จะขยาย มีอินเทอร์เฟซเสริมอื่น ๆ อีกสามแบบที่สามารถใช้งานได้เพื่อให้ได้ฟังก์ชันเพิ่มเติม:



  • โหลดเมตาดาต้า:

LoadMetadata มีวิธีจัดการกับข้อมูลเมตา การเรียกใช้งานรถตักส่วนใหญ่ไม่จำเป็นต้องใช้สิ่งนี้เว้นแต่จะโต้ตอบกับระบบข้อมูลเมตา เมธอด getSchema () ในอินเทอร์เฟซนี้นำเสนอวิธีสำหรับการใช้งานตัวโหลดเพื่อสื่อสารเกี่ยวกับสคีมาของข้อมูลกลับไปที่ Pig หากการใช้งานตัวโหลดส่งคืนข้อมูลที่ประกอบด้วยฟิลด์ประเภทจริงควรจัดเตรียมสคีมาที่อธิบายข้อมูลที่ส่งคืนผ่านเมธอด getSchema () วิธีการอื่น ๆ จัดการกับข้อมูลเมตาประเภทอื่น ๆ เช่นคีย์พาร์ติชันและสถิติ การนำไปใช้งานสามารถส่งคืนค่าที่ส่งคืนค่าว่างสำหรับวิธีการเหล่านี้หากไม่ถูกต้องสำหรับการนำไปใช้งานอื่น

  • LoadPushDown:

LoadPushDown มีวิธีการที่แตกต่างกันในการผลักดันการดำเนินการจาก Pig runtime ไปสู่การใช้งานตัวโหลด ขณะนี้มีเพียงเมธอด pushProjection () เท่านั้นที่ Pig เรียกใช้เพื่อสื่อสารกับตัวโหลดซึ่งเป็นฟิลด์ที่ต้องการในสคริปต์ Pig การใช้งานตัวโหลดสามารถเลือกที่จะปฏิบัติตามหรือไม่ปฏิบัติตามคำขอ หากการใช้งานตัวโหลดตัดสินใจที่จะปฏิบัติตามคำขอก็ควรใช้ LoadPushDown เพื่อปรับปรุงประสิทธิภาพการสืบค้น

  • pushProjection ():

วิธีนี้จะแจ้ง LoadFunc ซึ่งช่องที่จำเป็นในสคริปต์ Pig ดังนั้นการเปิดใช้งาน LoadFunc เพื่อเพิ่มประสิทธิภาพโดยการโหลดเฉพาะฟิลด์ที่จำเป็น pushProjection () ใช้ 'requiredFieldList' 'requiredFieldList' คืออ่านอย่างเดียวและ LoadFunc ไม่สามารถเปลี่ยนแปลงได้ 'requiredFieldList' ประกอบด้วยรายการของ 'requiredField' โดยที่ 'requiredField' แต่ละช่องจะระบุฟิลด์ที่สคริปต์ Pig ต้องการและประกอบด้วยดัชนีนามแฝงประเภทและฟิลด์ย่อย Pig ใช้ดัชนีคอลัมน์ requiredField.index เพื่อสื่อสารกับ LoadFunc เกี่ยวกับฟิลด์ที่สคริปต์ Pig ต้องการ หากฟิลด์ที่ต้องการคือแผนที่ Pig จะส่ง 'requiredField.subFields' ซึ่งมีรายการคีย์ที่สคริปต์ Pig ต้องการสำหรับแผนที่



ประเภทของกรอบในซีลีเนียม
  • โหลดแคสเตอร์:

LoadCaster มีเทคนิคในการแปลงไบต์อาร์เรย์เป็นประเภทเฉพาะ การใช้งานตัวโหลดควรใช้สิ่งนี้เมื่อจำเป็นต้องได้รับการสนับสนุนจากฟิลด์ DataByteArray โดยนัยหรืออย่างชัดเจนไปยังประเภทอื่น ๆ

คลาสนามธรรม LoadFunc เป็นคลาสหลักที่จะขยายสำหรับการใช้งานตัวโหลด วิธีการที่จำเป็นในการลบล้างมีอธิบายไว้ด้านล่าง:

  • getInputFormat ():

    วิธีนี้เรียกโดย Pig เพื่อรับ InputFormat ที่ใช้โดยตัวโหลด เมธอดใน InputFormat ถูกเรียกโดย Pig ในลักษณะเดียวกับ Hadoop ในโปรแกรม MapReduce Java หาก InputFormat เป็น Hadoop แบบแพ็กเกจการนำไปใช้งานควรใช้ API ใหม่ภายใต้ org.apache.hadoop.mapreduce หากเป็น InputFormat ที่กำหนดเองจะเป็นการดีกว่าหากนำไปใช้โดยใช้ API ใหม่ใน org.apache.hadoop.mapreduce

  • setLocation ():

    Pig เรียกวิธีนี้เพื่อสื่อสารตำแหน่งโหลดไปยังตัวโหลด ตัวโหลดจำเป็นต้องใช้วิธีนี้เพื่อสื่อสารข้อมูลเดียวกันกับ InputFormat หลัก วิธีนี้เรียกว่าหมูหลายครั้ง

  • เตรียมความพร้อมอ่าน ():

    ในวิธีนี้ RecordReader ที่เกี่ยวข้องกับ InputFormat ที่โหลดโดย LoadFunc จะถูกส่งไปยัง LoadFunc ตอนนี้ RecordReader สามารถใช้โดยการนำไปใช้ใน getNext () เพื่อส่งคืนทูเพิลที่แสดงถึงบันทึกข้อมูลกลับไปที่ Pig

  • getNext ():

    ความหมายของ getNext () ไม่ได้เปลี่ยนแปลงและเรียกโดย Pig runtime เพื่อรับทูเพิลถัดไปในข้อมูล ในวิธีนี้การนำไปใช้ควรใช้ RecordReader และสร้างทูเพิลเพื่อส่งคืน

การใช้งานเริ่มต้นใน LoadFunc:

โปรดทราบว่าการใช้งานเริ่มต้นใน LoadFunc ควรถูกแทนที่เมื่อจำเป็นเท่านั้น

  • setUdfContextSignature ():

    วิธีนี้จะถูกเรียกโดย Pig ทั้งในส่วนหน้าและส่วนหลังเพื่อส่งลายเซ็นเฉพาะไปยัง Loader ลายเซ็นสามารถใช้เพื่อจัดเก็บข้อมูลใด ๆ ใน UDFContext ซึ่ง Loader ต้องการจัดเก็บระหว่างการเรียกใช้วิธีการต่างๆในส่วนหน้าและส่วนหลัง กรณีการใช้งานคือการจัดเก็บ RequiredFieldList ที่ส่งผ่านไปยัง LoadPushDown.pushProjection (RequiredFieldList) เพื่อใช้ในส่วนหลังก่อนส่งคืนทูเปิลใน getNext () การใช้งานเริ่มต้นใน LoadFunc มีเนื้อความว่างเปล่า วิธีนี้จะถูกเรียกใช้ก่อนวิธีอื่น

  • relativeToAbsolutePath ():

    รันไทม์ Pig จะเรียกวิธีนี้เพื่ออนุญาตให้ Loader แปลงตำแหน่งโหลดสัมพัทธ์เป็นตำแหน่งที่แน่นอน การใช้งานดีฟอลต์ที่มีให้ใน LoadFunc จะจัดการสิ่งนี้สำหรับตำแหน่ง FileSystem หากโหลดซอร์สเป็นอย่างอื่นการใช้งานตัวโหลดอาจเลือกที่จะลบล้างสิ่งนี้

การใช้งานตัวโหลดในตัวอย่างคือตัวโหลดสำหรับข้อมูลข้อความที่มีตัวคั่นบรรทัดเป็น '
'และ' เป็นตัวคั่นฟิลด์เริ่มต้นคล้ายกับตัวโหลด PigStorage ปัจจุบันใน Pig การใช้งานใช้ Hadoop ที่มีอยู่ซึ่งรองรับ Inputformat - TextInputFormat - เป็น InputFormat ที่อยู่ภายใต้

คลาสสาธารณะ SimpleTextLoader ขยาย LoadFunc {protected RecordReader ใน = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {a} / ** * Construct รถตักหมูที่ใช้อักขระที่ระบุเป็นตัวคั่นฟิลด์ * * ตัวคั่น @param * อักขระไบต์เดี่ยวที่ใช้เพื่อแยกฟิลด์ * ('' เป็นค่าเริ่มต้น) * / public SimpleTextLoader (ตัวคั่นสตริง) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {สวิตช์ (delimiter.charAt (1)) {case 't': this.fieldDel = (byte) '' break case 'x' : fieldDel = Integer.valueOf (delimiter.substring (2), 16) .byteValue () break case 'u': this.fieldDel = Integer.valueOf (delimiter.substring (2)). byteValue () break default: throw new RuntimeException ('Unknown delimiter' + delimiter)}} else {throw new RuntimeException ('PigStorage delimeter must be a single character')}} @Override public Tuple getNext () พ่น IOException {try {boolean notDone = in.nextKeyValue () if (notDone) {return null} ค่าข้อความ = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 สำหรับ (int i = 0 iมีคำถามสำหรับเรา? โปรดระบุไว้ในส่วนความคิดเห็นแล้วเราจะติดต่อกลับไป 

กระทู้ที่เกี่ยวข้อง:

ความแตกต่างระหว่างการค้นหาที่เชื่อมต่อและไม่เชื่อมต่อ