Apache Pig UDF: Bahagian 1 - Fungsi Eval, Agregat & Penapis



Catatan ini menerangkan mengenai Apache Pig UDF - Fungsi Eval, Agregat & Penapis. Lihatlah Fungsi Eval, Agregat & Penapis.

Apache Pig memberikan sokongan luas untuk fungsi yang ditentukan pengguna (UDF) sebagai cara untuk menentukan pemprosesan tersuai. Babi UDF pada masa ini dapat dijalankan dalam tiga bahasa: Java, Python, JavaScript dan Ruby. Sokongan yang paling luas diberikan untuk fungsi Java.





Java UDF dapat dipanggil melalui pelbagai cara. UDF yang paling mudah hanya dapat memanjangkan EvalFunc, yang hanya memerlukan fungsi exec untuk dilaksanakan. Setiap UDF Eval mesti melaksanakan ini. Selain itu, jika fungsi bersifat algebra, ia dapat melaksanakan antara muka Algebra untuk meningkatkan prestasi pertanyaan dengan ketara.

Kepentingan UDF dalam Babi:

Babi membolehkan pengguna menggabungkan operator yang ada dengan kod mereka sendiri atau orang lain melalui UDF. Kelebihan Babi adalah kemampuannya membiarkan pengguna menggabungkan pengendali dengan kod mereka sendiri atau orang lain melalui UDF. Hingga versi 0.7, semua UDF mesti ditulis dalam Java dan dilaksanakan sebagai kelas Java. Ini menjadikannya lebih mudah untuk menambahkan UDF baru ke Babi dengan menulis kelas Java dan memberitahu Pig mengenai fail JAR.



Babi itu sendiri dilengkapi dengan beberapa UDF. Sebelum versi 0.8, itu adalah set yang sangat terhad dengan hanya fungsi agregat SQL standard dan beberapa yang lain. Pada 0.8, sejumlah besar pemprosesan rentetan standard, matematik, dan UDF jenis kompleks ditambahkan.

apakah perbezaan antara javascript dan jquery

Apa itu Piggybank?

Piggybank adalah koleksi UDF yang disumbangkan oleh pengguna yang dilancarkan bersama dengan Pig. Piggybank UDF tidak termasuk dalam Babi JAR, jadi anda harus mendaftarkannya secara manual dalam skrip anda. Anda juga boleh menulis UDF anda sendiri atau menggunakan yang ditulis oleh pengguna lain.

Fungsi Eval

Kelas UDF memperluas kelas EvalFunc yang merupakan asas untuk semua fungsi Eval. Semua fungsi Penilaian memperluas kelas Java 'org.apache.pig.EvalFunc. 'Ini diukur dengan jenis pengembalian UDF yang merupakan Java String dalam hal ini. Kaedah inti dalam kelas ini adalah 'exec.' Baris pertama kod menunjukkan bahawa fungsi tersebut adalah sebahagian daripada pakej myudfs.



Ia memerlukan satu catatan dan mengembalikan satu hasil, yang akan dipanggil untuk setiap catatan yang melewati saluran pelaksanaan. Dibutuhkan tuple, yang berisi semua bidang yang dilalui skrip ke UDF anda sebagai input. Ia kemudian mengembalikan jenis yang anda parameterkan EvalFunc.

Fungsi ini dipanggil pada setiap tupel input. Input ke fungsi adalah tuple dengan parameter input dalam urutan mereka diteruskan ke fungsi dalam skrip Babi. Dalam contoh yang ditunjukkan di bawah, fungsi mengambil rentetan sebagai input. Fungsi berikut menukar rentetan dari huruf kecil ke huruf besar. Sekarang fungsi ini dilaksanakan, ia perlu disusun dan dimasukkan dalam JAR.

pakej myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data. Tingkatan kelas awam UPPER memanjangkan EvalFunc {public String exec (input Tuple) melemparkan IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {lemparkan IOException baru ('Tertangkap pengecualian proses input baris', e)}}}

Fungsi Agregat:

Fungsi agregat adalah jenis fungsi Eval yang biasa. Fungsi agregat biasanya diterapkan pada data yang dikelompokkan. Fungsi Agregat mengambil beg dan mengembalikan nilai skalar. Ciri menarik dan berharga dari banyak fungsi Agregat ialah fungsi tersebut dapat dikira secara bertahap dengan cara yang diedarkan. Di dunia Hadoop, ini bermaksud bahawa pengiraan separa dapat dilakukan oleh Map and Combiner dan hasil akhir dapat dikira oleh Reducer.

Adalah sangat penting untuk memastikan bahawa fungsi agregat yang bersifat algebra dilaksanakan seperti itu. Contoh jenis ini termasuk COUNT, MIN, MAX dan PURATA terbina dalam.

BANYAK adalah contoh fungsi algebra di mana kita dapat mengira bilangan elemen dalam subset data dan kemudian menjumlahkan kiraan untuk menghasilkan output akhir. Mari kita lihat pelaksanaan fungsi COUNT:

kelas awam COUNT meluaskan EvalFunc mengimplementasikan Algebraic {public Long exec (Tuple input) melemparkan IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} kelas awam statik Permulaan memanjangkan EvalFunc {public Tuple exec (Tuple input) melemparkan IOException {return TupleFactory.getInstance (). newTuple (count (input)) } kelas awam statik Intermed memanjangkan EvalFunc {public Tuple exec (Tuple input) melemparkan IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} kelas awam statik Final meluaskan lontaran EvalFunc {public Tuple exec (Tuple input) IOException {return sum (input)}} kiraan panjang terlindung statik (input Tuple) melemparkan ExecException {Object Values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag))). instanceof Map) mengembalikan nilai Long (((Peta)) baru. ukuran ())} Jumlah panjang dilindungi statik (Tuple i nput) melemparkan ExecException, NumberFormatException {DataBag Values ​​= (DataBag) input.get (0) jumlah panjang = 0 untuk (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Panjang) t.get (0)} jumlah pulangan}}

COUNT menggunakan antara muka Algebra yang kelihatan seperti ini:

antara muka awam Algebraic {public String getInitial () public String getIntermed () public String getFinal ()}

Agar fungsi menjadi aljabar, ia perlu melaksanakan antara muka Algebra yang terdiri daripada definisi tiga kelas yang berasal dari EvalFunc. Kontraknya adalah bahawa pelaksanaan kelas Awal dipanggil sekali dan diteruskan ke tuple input asal. Keluarannya adalah tuple yang mengandungi hasil separa. Fungsi exec kelas Intermed boleh disebut sifar atau lebih banyak kali dan mengambil sebagai masukan tuple yang mengandungi hasil separa yang dihasilkan oleh kelas Awal atau dengan panggilan sebelumnya dari kelas Intermed dan menghasilkan tuple dengan hasil separa yang lain. Akhirnya, fungsi exec kelas Akhir dipanggil dan memberikan hasil akhir sebagai jenis skalar.

Fungsi Penapis:

Fungsi filter adalah fungsi Eval yang mengembalikan nilai Boolean. Ia boleh digunakan di mana sahaja ungkapan Boolean sesuai, termasuk pengendali FILTER atau ekspresi Bincond. Apache Pig tidak menyokong Boolean sepenuhnya, jadi fungsi Filter tidak dapat muncul dalam pernyataan seperti 'Foreach', di mana hasilnya dikeluarkan ke operator lain. Walau bagaimanapun, fungsi Penapis boleh digunakan dalam penyataan penyaring.

pemacu web selenium dengan contoh timun dalam gerhana

Contoh di bawah melaksanakan fungsi IsEmpty:

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBag import org.apache.pig.data.Tupport import org.apache.pig.data.DataType / ** * Tentukan sama ada beg atau peta kosong. * / kelas awam IsEmpty memanjangkan FilterFunc {@Override public Boolean exec (Tuple input) melemparkan IOException {cuba {Objek nilai = input.get (0) jika (nilai instanceof DataBag) mengembalikan nilai ((DataBag)) .size () == 0 lagi jika (nilai instance dari Peta) kembali ((Peta) nilai) .saiz () == 0 lain {int errCode = 2102 String msg = 'Tidak dapat menguji' + DataType.findTypeName (nilai) + 'untuk kekosongan.' lemparkan ExecException baru (msg, errCode, PigException.BUG)}} tangkap (ExecException ee) {buang ee}}}