Apache Pig UDF: Bahagian 2 - Fungsi Beban



Catatan ini menerangkan mengenai Apache Pig UDF - Fungsi Beban. (Babi Apache UDF: Bahagian 2). Lihatlah Fungsi Beban Apache Pig UDF.

Posting hari ini adalah mengenai fungsi Load di Apache Pig. Ini adalah sekuel dari jawatan pertama yang merangkumi fungsi UDF seperti Eval, Filter dan Agregat. Sila baca kepada mereka untuk maklumat lebih lanjut mengenai fungsi lain dari Babi UDF.





php.mysql_fetch_array

Fungsi memuat babi dibina di atas InputFormat Hadoop, kelas yang digunakan Hadoop untuk membaca data. InputFormat mempunyai dua tujuan: Ini menentukan bagaimana input akan terpecah-pecah antara tugas peta dan menyediakan RecordReader yang menghasilkan pasangan nilai-kunci sebagai input kepada tugas-tugas peta tersebut. Kelas asas untuk fungsi beban adalah LoadFunc.

Fungsi Beban - Klasifikasi:

Kelas abstrak LoadFunc mempunyai tiga kaedah utama untuk memuatkan data dan dalam kebanyakan kes penggunaan, cukup untuk memperluasnya. Terdapat tiga antara muka pilihan lain yang dapat dilaksanakan untuk mencapai fungsi yang diperluas:



  • Muatkan Metadata:

LoadMetadata mempunyai kaedah untuk menangani metadata. Sebilangan besar pelaksanaan loader tidak perlu melaksanakannya kecuali mereka berinteraksi dengan sistem metadata. Kaedah getSchema () dalam antara muka ini menawarkan cara untuk implementasi loader untuk berkomunikasi mengenai skema data kembali ke Babi. Sekiranya implementasi pemuat mengembalikan data yang terdiri dari bidang jenis nyata, ia harus menyediakan skema yang menggambarkan data yang dikembalikan melalui kaedah getSchema (). Kaedah lain menangani jenis metadata lain seperti kunci partition dan statistik. Pelaksanaan dapat mengembalikan nilai nol kembali untuk kaedah ini jika tidak berlaku untuk pelaksanaan lain.

  • LoadPushDown:

LoadPushDown mempunyai kaedah yang berbeza untuk mendorong operasi dari babi runtime ke implementasi loader. Pada masa ini, hanya kaedah pushProjection () yang dipanggil oleh Babi untuk berkomunikasi dengan pemuat, bidang tepat yang diperlukan dalam skrip Babi. Pelaksanaan loader dapat memilih untuk mematuhi atau tidak mematuhi permintaan. Sekiranya implementasi loader memutuskan untuk memenuhi permintaan tersebut, implementasi loader harus menerapkan LoadPushDown untuk meningkatkan prestasi pertanyaan.

  • pushProjection ():

Kaedah ini memberitahu LoadFunc, bidang mana yang diperlukan dalam skrip Babi. Oleh itu membolehkan LoadFunc meningkatkan prestasi dengan memuatkan hanya medan yang diperlukan. pushProjection () mengambil 'requiredFieldList.' '' diperlukanFieldList 'hanya dibaca dan tidak boleh diubah oleh LoadFunc. ‘RequiredFieldList’ merangkumi senarai ‘requiredField’, di mana setiap ‘requiredField’ menunjukkan bidang yang diperlukan oleh skrip Babi dan terdiri daripada indeks, alias, jenis dan subField. Babi menggunakan indeks lajur diperlukanField.index untuk berkomunikasi dengan LoadFunc mengenai bidang yang diperlukan oleh skrip Babi. Sekiranya medan yang diperlukan adalah peta, Babi akan melewati 'requiredField.subFields' yang mengandungi senarai kunci yang diperlukan oleh skrip Babi untuk peta.



  • LoadCaster:

LoadCaster mempunyai teknik untuk menukar susunan bait menjadi jenis tertentu. Pelaksanaan loader harus melaksanakan ini apabila pemerhatian tersirat atau eksplisit dari bidang DataByteArray ke jenis lain perlu disokong.

Kelas abstrak LoadFunc adalah kelas utama yang perlu diperluas untuk melaksanakan pemuat. Kaedah-kaedah yang perlu ditolak dijelaskan di bawah:

  • getInputFormat ():

    Kaedah ini dipanggil oleh Babi untuk mendapatkan InputFormat yang digunakan oleh loader. Kaedah dalam InputFormat dipanggil oleh Pig dengan cara yang sama seperti Hadoop dalam program MapReduce Java. Sekiranya InputFormat adalah paket Hadoop, pelaksanaannya harus menggunakan API berdasarkan API baru, di bawah org.apache.hadoop.mapreduce. Sekiranya ia adalah InputFormat tersuai, lebih baik dilaksanakan menggunakan API baru di org.apache.hadoop.mapreduce.

  • setLokasi ():

    Kaedah ini dipanggil oleh Babi untuk menyampaikan lokasi beban kepada pemuat. Pemuat perlu menggunakan kaedah ini untuk menyampaikan maklumat yang sama kepada InputFormat teras. Kaedah ini dipanggil berkali-kali oleh babi.

  • siapkan ToRead ():

    Dalam kaedah ini, RecordReader yang berkaitan dengan InputFormat yang disediakan oleh LoadFunc diteruskan ke LoadFunc. RecordReader sekarang dapat digunakan oleh implementasi di getNext () untuk mengembalikan tuple yang mewakili catatan data kembali ke Babi.

  • getNext ():

    Makna getNext () tidak berubah dan dipanggil oleh babi runtime untuk memperoleh tuple berikutnya dalam data. Dalam kaedah ini, pelaksanaan harus menggunakan RecordReader yang mendasari dan membina tuple untuk kembali.

Pelaksanaan Lalai dalam LoadFunc:

Perhatikan bahawa pelaksanaan lalai di LoadFunc hanya akan ditimpa apabila diperlukan.

  • setUdfContextSignature ():

    Kaedah ini akan dipanggil oleh Babi, baik di hujung depan dan belakang untuk menyampaikan tandatangan unik kepada Loader. Tanda tangan boleh digunakan untuk menyimpan segala maklumat ke dalam UDFContext yang perlu disimpan oleh Loader antara pelbagai kaedah panggilan di hujung depan dan hujung belakang. Kes penggunaan adalah untuk menyimpan RequiredFieldList yang diteruskan kepadanya di LoadPushDown.pushProjection (RequiredFieldList) untuk digunakan di bahagian belakang sebelum mengembalikan tupel di getNext (). Pelaksanaan lalai di LoadFunc mempunyai badan kosong. Kaedah ini akan dipanggil sebelum kaedah lain.

  • relatifToAbsolutePath ():

    Babi runtime akan memanggil kaedah ini untuk membolehkan Loader menukar lokasi beban relatif ke lokasi mutlak. Pelaksanaan lalai yang disediakan di LoadFunc menangani ini untuk lokasi FileSystem. Sekiranya sumber beban adalah sesuatu yang lain, pelaksanaan pemuat mungkin memilih untuk mengatasi ini.

Pelaksanaan loader dalam contohnya adalah loader untuk data teks dengan pembatas garis sebagai '
'Dan' 'sebagai pembatas medan lalai yang serupa dengan pemuat PigStorage semasa di Babi. Pelaksanaannya menggunakan Inputformat yang didukung Hadoop - TextInputFormat - sebagai InputFormat yang mendasari.

kelas awam SimpleTextLoader memperluas LoadFunc {dilindungi RecordReader dalam = medan byte peribadi kosongDel = 'ArrayList peribadi mProtoTuple = null peribadi TupleFactory mTupleFactory = TupleFactory.getInstance () akhir statik peribadi int BUFFER_SIZE = 1024 awam SimpleTextLoader Pemuat babi yang menggunakan watak yang ditentukan sebagai pembatas medan. * * @param delimiter * watak bait tunggal yang digunakan untuk memisahkan bidang. * ('' adalah lalai.) * / public SimpleTextLoader (String delimiter) {this () if (delimiter.length () == 1) {this.fieldDel = (byte) delimiter.charAt (0)} lain jika ( 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: membuang baru RuntimeException ('Unknown delimiter' + delimiter)}} lain {buang RuntimeException baru ('PigStorage delimeter mestilah satu watak')}} @ Override public Tuple getNext () melemparkan IOException {cuba {boolean notDone = in.nextKeyValue () jika (notDone) {return null} Nilai teks = (Teks) in.getCurrentValue () bait [] buf = value.getBytes () int len ​​= value.getLength () int start = 0 untuk (int i = 0 iAda soalan untuk kami? Sila sebutkan di bahagian komen dan kami akan menghubungi anda. 

Catatan berkaitan: