Apache Pig UDF: Bagian 2 - Fungsi Muat



Posting ini menjelaskan tentang Apache Pig UDF - Fungsi Muat. (Apache Pig UDF: Bagian 2). Lihat Fungsi Muat Apache Pig UDF.

Posting hari ini adalah tentang fungsi Muat di Apache Pig. Ini adalah sekuel dari Pos pertama yang mencakup fungsi UDF seperti Evaluasi, Filter, dan Agregat. Silakan baca kembali mereka untuk informasi lebih lanjut tentang fungsi lain dari Pig UDF.





Fungsi pemuatan Pig dibangun di atas InputFormat Hadoop, kelas yang digunakan Hadoop untuk membaca data. InputFormat memiliki dua tujuan: Ini menentukan bagaimana masukan akan difragmentasi antara tugas peta dan menyediakan RecordReader yang menghasilkan pasangan nilai kunci sebagai masukan untuk tugas peta tersebut. Kelas dasar untuk fungsi beban adalah LoadFunc.

Fungsi Beban - Klasifikasi:

Kelas abstrak LoadFunc memiliki tiga metode utama untuk memuat data dan dalam kebanyakan kasus penggunaan itu sudah cukup untuk memperluasnya. Ada tiga antarmuka opsional lain yang dapat diterapkan untuk mencapai fungsionalitas yang diperluas:



  • LoadMetadata:

LoadMetadata memiliki metode untuk menangani metadata. Sebagian besar eksekusi loader tidak perlu menerapkan ini kecuali mereka berinteraksi dengan sistem metadata. Metode getSchema () dalam antarmuka ini menawarkan cara bagi implementasi loader untuk berkomunikasi tentang skema data kembali ke Pig. Jika implementasi loader mengembalikan data yang terdiri dari bidang tipe nyata, itu harus menyediakan skema yang menjelaskan data yang dikembalikan melalui metode getSchema (). Metode lain menangani jenis metadata lain seperti kunci partisi dan statistik. Implementasi dapat mengembalikan nilai pengembalian null untuk metode ini jika tidak valid untuk implementasi lainnya.

  • LoadPushDown:

LoadPushDown memiliki metode berbeda untuk mendorong operasi dari runtime Pig ke dalam implementasi loader. Saat ini, hanya metode pushProjection () yang dipanggil oleh Pig untuk berkomunikasi dengan loader, bidang persis yang diperlukan dalam skrip Pig. Penerapan loader dapat memilih untuk mematuhi atau tidak mematuhi permintaan. Jika implementasi loader memutuskan untuk mematuhi permintaan, itu harus mengimplementasikan LoadPushDown untuk meningkatkan kinerja kueri.

  • pushProjection ():

Metode ini menginformasikan LoadFunc, bidang mana yang diperlukan dalam skrip Pig. Sehingga memungkinkan LoadFunc untuk meningkatkan kinerja dengan hanya memuat bidang yang diperlukan. pushProjection () mengambil 'requiredFieldList'. 'requiredFieldList' bersifat hanya baca dan tidak dapat diubah oleh LoadFunc. 'RequiredFieldList' menyertakan daftar 'requiredField', di mana setiap 'requiredField' menunjukkan bidang yang dibutuhkan oleh skrip Pig dan terdiri dari indeks, alias, jenis, dan subField. Pig menggunakan indeks kolom requiredField.index untuk berkomunikasi dengan LoadFunc tentang bidang yang dibutuhkan oleh skrip Pig. Jika bidang yang diperlukan adalah peta, Pig akan meneruskan 'requiredField.subFields' yang berisi daftar kunci yang dibutuhkan oleh skrip Pig untuk peta.



  • LoadCaster:

LoadCaster memiliki teknik untuk mengubah array byte menjadi tipe tertentu. Implementasi loader harus mengimplementasikan ini ketika transmisi implisit atau eksplisit dari bidang DataByteArray ke jenis lain perlu didukung.

Kelas abstrak LoadFunc adalah kelas utama yang perlu diperluas untuk mengimplementasikan loader. Metode yang perlu diganti dijelaskan di bawah ini:

  • getInputFormat ():

    Metode ini dipanggil oleh Pig untuk mendapatkan InputFormat yang digunakan oleh loader. Metode dalam InputFormat dipanggil oleh Pig dengan cara yang sama seperti Hadoop dalam program Java MapReduce. Jika InputFormat adalah paket Hadoop, implementasi harus menggunakan API berbasis API baru, di bawah org.apache.hadoop.mapreduce. Jika ini adalah InputFormat khusus, lebih baik diimplementasikan menggunakan API baru di org.apache.hadoop.mapreduce.

  • setLocation ():

    Metode ini dipanggil oleh Pig untuk mengkomunikasikan lokasi pemuatan ke pemuat. Loader perlu menggunakan metode ini untuk mengomunikasikan informasi yang sama ke InputFormat inti. Metode ini disebut berkali-kali oleh babi.

  • preparedToRead ():

    Dalam metode ini, RecordReader yang terkait dengan InputFormat yang disediakan oleh LoadFunc diteruskan ke LoadFunc. RecordReader sekarang dapat digunakan oleh implementasi di getNext () untuk mengembalikan tupel yang mewakili catatan data kembali ke Pig.

  • getNext ():

    Arti getNext () tidak berubah dan dipanggil oleh runtime Pig untuk mendapatkan tupel berikutnya dalam data. Dalam metode ini, implementasi harus menggunakan RecordReader yang mendasari dan membangun tupel untuk dikembalikan.

Implementasi Default di LoadFunc:

Perhatikan bahwa implementasi default di LoadFunc harus diganti hanya jika diperlukan.

cara mengatur classpath di java
  • setUdfContextSignature ():

    Metode ini akan dipanggil oleh Pig, baik di ujung depan maupun di belakang untuk meneruskan tanda tangan unik ke Loader. Tanda tangan dapat digunakan untuk menyimpan informasi apa pun ke dalam konteks UDFC yang perlu disimpan oleh Loader di antara berbagai pemanggilan metode di ujung depan dan belakang. Kasus penggunaannya adalah untuk menyimpan RequiredFieldList yang diteruskan ke LoadPushDown.pushProjection (RequiredFieldList) untuk digunakan di back end sebelum mengembalikan tupel di getNext (). Implementasi default di LoadFunc memiliki isi kosong. Metode ini akan dipanggil sebelum metode lain.

  • relativeToAbsolutePath ():

    Waktu proses pig akan memanggil metode ini untuk mengizinkan Loader mengonversi lokasi beban relatif ke lokasi absolut. Implementasi default yang disediakan di LoadFunc menangani ini untuk lokasi FileSystem. Jika sumber muat adalah sesuatu yang lain, implementasi pemuat dapat memilih untuk menimpanya.

Implementasi pemuat dalam contoh ini adalah pemuat untuk data teks dengan pembatas baris sebagai '
'Dan' 'sebagai pembatas bidang default mirip dengan pemuat PigStorage saat ini di Pig. Implementasinya menggunakan Inputformat yang didukung Hadoop - TextInputFormat - sebagai InputFormat yang mendasarinya.

public class SimpleTextLoader memperluas LoadFunc {protected RecordReader in = null private byte fieldDel = '' private ArrayList mProtoTuple = null private TupleFactory mTupleFactory = TupleFactory.getInstance () private static final int BUFFER_SIZE = 1024 public SimpleTextLoader () {} / ** * Constructs a Pig loader yang menggunakan karakter tertentu sebagai pemisah bidang. * * @param delimiter * karakter byte tunggal yang digunakan untuk memisahkan bidang. * ('' adalah defaultnya.) * / public SimpleTextLoader (Pembatas string) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} else if ( delimiter.length ()> 1 & & delimiter.charAt (0) == '') {switch (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: lempar baru RuntimeException ('Unknown delimiter' + delimiter)}} lain {lempar RuntimeException baru ('PigStorage delimeter harus satu karakter')}} @Override public Tuple getNext () melontarkan IOException {coba {boolean notDone = in.nextKeyValue () jika (notDone) {return null} Text value = (Text) in.getCurrentValue () byte [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 untuk (int i = 0 iAda pertanyaan untuk kami? Harap sebutkan di bagian komentar dan kami akan menghubungi Anda kembali. 

Posting terkait: