Apache Pig UDF: Bagian 1 - Fungsi Evaluasi, Agregat & Filter



Posting ini menjelaskan tentang Apache Pig UDF - Fungsi Evaluasi, Agregat & Filter. Lihatlah Fungsi Evaluasi, Agregat & Filter.

Apache Pig memberikan dukungan ekstensif untuk fungsi yang ditentukan pengguna (UDF) sebagai cara untuk menentukan pemrosesan kustom. Pig UDFs saat ini dapat dijalankan dalam tiga bahasa: Java, Python, JavaScript, dan Ruby. Dukungan paling luas disediakan untuk fungsi Java.





UDF Java dapat dipanggil melalui berbagai cara. UDF paling sederhana hanya dapat memperluas EvalFunc, yang hanya memerlukan fungsi exec untuk diimplementasikan. Setiap UDF Eval harus menerapkan ini. Selain itu, jika suatu fungsi bersifat aljabar, ia dapat mengimplementasikan antarmuka Aljabar untuk meningkatkan kinerja kueri secara signifikan.

Pentingnya UDF pada Babi:

Pig memungkinkan pengguna untuk menggabungkan operator yang ada dengan kode mereka sendiri atau orang lain melalui UDF. Keuntungan Pig adalah kemampuannya untuk memungkinkan pengguna menggabungkan operatornya dengan kode mereka sendiri atau orang lain melalui UDF. Sampai versi 0.7, semua UDF harus ditulis dalam Java dan diimplementasikan sebagai kelas Java. Ini membuatnya lebih mudah untuk menambahkan UDF baru ke Pig dengan menulis kelas Java dan memberi tahu Pig tentang file JAR.



Pig sendiri hadir dengan beberapa UDF. Sebelum versi 0.8, itu adalah set yang sangat terbatas dengan hanya fungsi agregat SQL standar dan beberapa lainnya. Di 0.8, sejumlah besar pemrosesan string standar, matematika, dan UDF tipe kompleks ditambahkan.

Apa itu Celengan?

Piggybank adalah kumpulan UDF kontribusi pengguna yang dirilis bersama dengan Pig. Piggybank UDF tidak termasuk dalam Pig JAR, jadi Anda harus mendaftarkannya secara manual di skrip Anda. Anda juga dapat menulis UDF Anda sendiri atau menggunakan UDF yang ditulis oleh pengguna lain.

Fungsi Evaluasi

Kelas UDF memperluas kelas EvalFunc yang merupakan basis untuk semua fungsi Eval. Semua fungsi Evaluasi memperluas kelas Java 'org.apache.pig.EvalFunc. 'Ini diparameterisasi dengan tipe kembalian UDF yang merupakan String Java dalam kasus ini. Metode inti di kelas ini adalah 'exec.' Baris pertama kode menunjukkan bahwa fungsi tersebut merupakan bagian dari paket myudfs.



string tanggal java sampai saat ini

Ini mengambil satu record dan mengembalikan satu hasil, yang akan dipanggil untuk setiap record yang melewati pipeline eksekusi. Dibutuhkan tupel, yang berisi semua bidang yang dilewatkan skrip ke UDF Anda sebagai input. Ia kemudian mengembalikan tipe yang Anda miliki parameterized EvalFunc.

Fungsi ini dipanggil pada setiap tupel masukan. Input ke dalam fungsi adalah tupel dengan parameter input dalam urutan yang diteruskan ke fungsi dalam skrip Pig. Dalam contoh yang ditunjukkan di bawah ini, fungsi mengambil string sebagai input. Fungsi berikut mengubah string dari huruf kecil menjadi huruf besar. Sekarang fungsi tersebut diimplementasikan, itu perlu dikompilasi dan dimasukkan dalam JAR.

paket myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple public class UPPER extends EvalFunc {public String exec (Tuple input) melempar IOException {if (input == null || input.size () == 0) kembalikan null coba {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {throw new IOException ('Caught exception processing input row', e)}}}

Fungsi Agregat:

Fungsi agregat adalah jenis umum lainnya dari fungsi Evaluasi. Fungsi agregat biasanya diterapkan ke data yang dikelompokkan. Fungsi Agregat mengambil kantong dan mengembalikan nilai skalar. Fitur yang menarik dan berharga dari banyak fungsi Agregat adalah bahwa fungsi tersebut dapat dihitung secara bertahap dengan cara terdistribusi. Di dunia Hadoop, ini berarti bahwa perhitungan parsial dapat dilakukan oleh Map dan Combiner dan hasil akhirnya dapat dihitung oleh Reducer.

Sangat penting untuk memastikan bahwa fungsi Agregat yang aljabar diimplementasikan seperti itu. Contoh jenis ini termasuk built-in COUNT, MIN, MAX dan AVERAGE.

MENGHITUNG adalah contoh fungsi aljabar di mana kita dapat menghitung jumlah elemen dalam subset data dan kemudian menjumlahkannya untuk menghasilkan keluaran akhir. Mari kita lihat penerapan fungsi COUNT:

public class COUNT extends EvalFunc mengimplementasikan Algebraic {public Long exec (Tuple input) melempar 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 publik statis Initial extends EvalFunc {public Tuple exec (Tuple input) melempar IOException {return TupleFactory.getInstance (). newTuple (count (input)) }} kelas publik statis Intermed meluas EvalFunc {public Tuple exec (Tuple input) melempar IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} kelas publik statis Final extends EvalFunc {public Tuple exec (masukan Tuple) melempar IOException {return sum (input)}} proteksi statis Hitungan panjang (masukan Tuple) melempar ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (values instanceof Map) mengembalikan nilai Long (((Map)) baru .size ())} jumlah panjang yang dilindungi statis (Tuple nput) melempar ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 untuk (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) jumlah + = (Long) t.get (0)} jumlah pengembalian}}

COUNT mengimplementasikan antarmuka Aljabar yang terlihat seperti ini:

antarmuka publik Aljabar {public String getInitial () public String getIntermed () public String getFinal ()}

Agar fungsi menjadi aljabar, perlu mengimplementasikan antarmuka Aljabar yang terdiri dari definisi tiga kelas yang diturunkan dari EvalFunc. Kontraknya adalah bahwa eksekusi kelas awal dipanggil sekali dan diteruskan ke tupel masukan asli. Keluarannya adalah tupel yang berisi hasil parsial. Fungsi exec dari kelas Intermed dapat dipanggil nol atau lebih dan mengambil sebagai masukannya sebuah tupel yang berisi hasil parsial yang dihasilkan oleh kelas awal atau oleh pemanggilan sebelumnya dari kelas Intermed dan menghasilkan sebuah tupel dengan hasil parsial lainnya. Akhirnya, fungsi exec dari kelas Final dipanggil dan memberikan hasil akhir sebagai tipe skalar.

apa itu java hashset

Fungsi Filter:

Fungsi filter adalah fungsi evaluasi yang mengembalikan nilai Boolean. Ini bisa digunakan di mana saja ekspresi Boolean sesuai, termasuk operator FILTER atau ekspresi Bincond. Apache Pig tidak mendukung Boolean sepenuhnya, jadi fungsi Filter tidak dapat muncul dalam pernyataan seperti 'Foreach', di mana hasilnya akan dikeluarkan ke operator lain. Namun, fungsi Filter dapat digunakan dalam pernyataan filter.

Contoh di bawah mengimplementasikan fungsi IsEmpty:

impor java.io.IOException impor java.util.Map impor org.apache.pig.FilterFunc impor org.apache.pig.PigException impor org.apache.pig.backend.executionengine.ExecException impor org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Tentukan apakah tas atau peta kosong. * / public class IsEmpty extends FilterFunc {@Override public Boolean exec (Tuple input) melempar IOException {coba {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (nilai instanceof Map) mengembalikan (nilai (Map)) .size () == 0 else {int errCode = 2102 String msg = 'Tidak dapat menguji' + DataType.findTypeName (values) + 'untuk kekosongan.' lempar ExecException baru (msg, errCode, PigException.BUG)}} tangkap (ExecException ee) {throw ee}}}