Saya telah membaca buku-buku terkait Hadoop dalam beberapa hari terakhir. Saya merasa sedikit seperti itu, jadi saya telah menulis produk yang terkait secara statistik dengan meniru program WordCount.
Deskripsi Persyaratan:
Menurut daftar penjualan supermarket, hitung tingkat korelasi antara barang (yaitu, hitung berapa kali Anda membeli barang A dan barang B pada saat yang sama).
Format Data:
Daftar penjualan supermarket disederhanakan untuk format berikut: Suatu baris mewakili daftar, dan setiap produk dibagi menjadi "," seperti yang ditunjukkan pada gambar di bawah ini:
Analisis Persyaratan:
Gunakan MapReduce di Hadoop untuk menghitung persyaratan ini.
Fungsi peta terutama membagi produk terkait, hasil output adalah bahwa kunci adalah produk A dan nilainya adalah produk B. Hasil split untuk hasil pertama dan tiga ditunjukkan pada gambar di bawah ini:
Untuk menghitung produk yang ingin dikaitkan dengan dua komoditas A dan B, hubungan antara komoditas A dan B menghasilkan dua hasil, yaitu AB dan BA.
Fungsi pengurangan dikelompokkan dan menghitung produk yang terkait dengan produk A, yaitu, menghitung berapa kali setiap produk muncul dalam nilai, dan hasil output adalah bahwa kunci adalah produk A | Produk B, dan nilainya adalah berapa kali kombinasi ini terjadi. Untuk 5 catatan yang disebutkan di atas, analisis nilai kunci R dalam output peta:
Melalui pemrosesan fungsi peta, catatan yang ditunjukkan pada gambar di bawah ini diperoleh:
Output nilai nilai dalam pengurangan dikelompokkan dan dihitung, dan hasilnya ditunjukkan pada gambar di bawah ini.
Gunakan produk AB sebagai kunci, gabungkan jumlah produk sebagai nilai output, dan hasil output ditunjukkan pada gambar di bawah ini:
Analisis proses implementasi persyaratan telah berakhir sejauh ini. Mari kita lihat implementasi kode spesifik di bawah ini.
Implementasi Kode:
Saya tidak akan memberikan pengantar terperinci untuk kode, silakan merujuk ke komentar dalam kode untuk detailnya.
paket com; impor java.io.ioException; impor java.util.hashmap; impor java.util.map.entry; impor org.apache.hadoop.conf.configuration; impor org.apache.hadoop.conf.configured; impor org.apache.hadoop.fs.path; impor org.apache.hadoop.io.intwritable; impor org.apache.hadoop.io.longwritable; impor org.apache.hadoop.io.text; impor org.apache.hadoop.mapreduce.job; impor org.apache.hadoop.mapreduce.mapper; impor org.apache.hadoop.mapreduce.reducer; impor org.apache.hadoop.mapreduce.lib.input.fileInputFormat; impor org.apache.hadoop.mapreduce.lib.output.fileOutputFormat; impor org.apache.hadoop.mapreduce.lib.output.TextOutputFormat; impor org.apache.hadoop.util.tool; impor org.apache.hadoop.util.toolrunner; public class Test extends Configured implements Tool{ /** * map class, implement data preprocessing* The output result key is product A value and the associated product B * @author lulei */ public static class MapT extends Mapper<LongWritable, Text, Text, Text> { public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException{ String line = value.toString(); if (! (line == null || "" .Equals (line)) {// Pisahkan string produk [] vs = line.split (","); // Menggabungkan keduanya untuk membentuk catatan untuk (int i = 0; i <(vs.length - 1); i ++) {if ("" .sequals (vs [vs i]) {/{{if (vs i]) {i {i]) {if; vs.Length; J ++) {if ("." Kunci hasil output adalah nilai produk a | this.count = integer.parseint (countStr); HashMap <string, integer> hashMap = new HashMap <string, integer> (); // Gunakan hash untuk menghitung jumlah kali produk B untuk (nilai teks: nilai) {string valuestr = value.toString (); if (hashmap.containskey (valuestr)) {hashmap.put (valuestr, hashmap.get (valuestr) + 1); } else {hashmap.put (valuestr, 1); } } //Output the result for (Entry<String, Integer> entry : hashMap.entrySet()) { if (entry.getValue() >= this.count) {//Only output context.write(new Text(keyStr + "|" + entry.getKey()), new IntWritable(entry.getValue())); }}}} @Override int run public (string [] arg0) melempar Exception {// TODO Auto-Metode Stub Configuration Confor = getConf (); conf.set ("count", arg0 [2]); Pekerjaan pekerjaan = pekerjaan baru (conf); job.setjobname ("jobtest"); job.setoutputFormatClass (TextOutPutFormat.class); job.setoutputKeyClass (text.class); job.setoutputValueClass (text.class); job.setmapperclass (mapt.class); job.setreducerclass (reducet.class); FileInputFormat.AddInputPath (Job, New Path (arg0 [0])); FileOutPutFormat.SetOutputPath (Job, Path baru (arg0 [1])); job.waitforcompletion (true); kembali pekerjaan.issuccessful ()? 0: 1; } / ** * @param args * / public static void main (string [] args) {// TODO Metode yang dihasilkan otomatis Stub if (args.length! = 3) {System.exit (-1); } coba {int res = toolrunner.run (konfigurasi baru (), test baru (), args); System.exit (res); } catch (Exception e) {// TODO Auto-Entoerated Catch Block E.PrintStackTrace (); }}} Unggah dan jalankan:
Kemas program ke dalam file jar dan unggah ke grup mesin. Unggah data uji ke sistem file terdistribusi HDFS juga.
Tangkapan layar dari perintah yang berjalan ditunjukkan pada gambar berikut:
Setelah menjalankan selesai, periksa sistem file HDFS yang sesuai, seperti yang ditunjukkan pada gambar di bawah ini:
Berikut adalah program MapReduce lengkap. Saya akan terus belajar tentang Hadoop ~ Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!