لقد قرأت الكتب المتعلقة Hadoop في الأيام الأخيرة. أشعر بهذه الطريقة قليلاً ، لذلك كتبت منتجًا مرتبطًا إحصائياً من خلال تقليد برنامج WordCount.
وصف المتطلبات:
وفقًا لقائمة مبيعات السوبر ماركت ، احسب درجة الارتباط بين البضائع (أي ، عد عدد المرات التي تشتري فيها البضائع A والبضائع B في نفس الوقت).
تنسيق البيانات:
يتم تبسيط قائمة مبيعات السوبر ماركت إلى التنسيق التالي: يمثل الخط قائمة ، ويتم تقسيم كل منتج إلى "، كما هو موضح في الشكل أدناه:
تحليل المتطلبات:
استخدم MapReduce في Hadoop لحساب هذا المطلب.
تقسم وظيفة الخريطة بشكل أساسي المنتجات المرتبطة بها ، وهي نتيجة الإخراج هي أن المفتاح هو المنتج A والقيمة هي المنتج ب. النتيجة المقسمة للنتائج الأولى والثلاث موضحة في الشكل أدناه:
من أجل حساب المنتجات التي تريد أن ترتبط بالسلعتين A و B ، فإن العلاقة بين السلعين A و B تخرج نتيجتين ، وهما AB و BA.
تم تجميع الوظيفة التي تم تجميعها وحساب المنتجات المتعلقة بالمنتج A ، أي حساب عدد مرات يظهر كل منتج في القيمة ، ونتيجة الإخراج هي أن المفتاح هو المنتج A | المنتج B ، والقيمة هي عدد مرات حدوث هذه المجموعة. بالنسبة للسجلات الخمسة المذكورة أعلاه ، قم بتحليل القيمة الرئيسية لـ R في إخراج الخريطة:
من خلال معالجة وظيفة الخريطة ، يتم الحصول على السجل الموضح في الشكل أدناه:
يتم تجميع إخراج القيمة في تقليل وحسابها ، وتظهر النتيجة في الشكل أدناه.
استخدم المنتج AB كمفتاح ، ودمج عدد المنتجات كقيمة للإخراج ، وترد نتيجة الإخراج في الشكل أدناه:
انتهى تحليل عملية تنفيذ المتطلبات حتى الآن. دعنا نلقي نظرة على تطبيق التعليمات البرمجية المحددة أدناه.
تنفيذ الكود:
لن أقدم مقدمة مفصلة للرمز ، يرجى الرجوع إلى التعليقات في الكود للحصول على التفاصيل.
حزمة كوم ؛ استيراد java.io.ioException ؛ استيراد java.util.hashmap ؛ استيراد java.util.map.entry ؛ استيراد org.apache.hadoop.conf.configuration ؛ استيراد org.apache.hadoop.conf.configured ؛ استيراد org.apache.hadoop.fs.path ؛ استيراد org.apache.hadoop.io.intwritable ؛ استيراد org.apache.hadoop.io.longwritable ؛ استيراد org.apache.hadoop.io.text ؛ استيراد org.apache.hadoop.mapreduce.job ؛ استيراد org.apache.hadoop.mapreduce.mapper ؛ استيراد org.apache.hadoop.mapreduce.reducer ؛ استيراد org.apache.hadoop.mapreduce.lib.input.fileInputFormat ؛ استيراد org.apache.hadoop.mapreduce.lib.output.fileOutputFormat ؛ استيراد org.apache.hadoop.mapreduce.lib.output.textOutputFormat ؛ استيراد org.apache.hadoop.util.tool ؛ استيراد org.apache.hadoop.util.toolrunner ؛ يمتد اختبار الفئة العامة الأدوات التي تم تكوينها { / ** * فئة الخريطة ، وتنفيذ المعالجة المسبقة للبيانات * مفتاح نتائج الإخراج هو منتج والمنتج المرتبط ب b * author lulei * / الفئة الثابتة العامة mapt يمتد mapper <longwrable ، text ، text ، text> {public void map (مفتاح longwriter المقاطع ، سياق السياق) throws iOexception ، if (! (line == null || "" .equals (line)) {// قم بتقسيم سلسلة المنتج [] vs = line.split ("،") ؛ // الجمع بين الاثنين لتشكيل سجل لـ (int i = 0 ؛ i <(vs.length - 1) ؛ i ++) {if (".". Vs.Length ؛ مفتاح نتيجة الإخراج هو القيمة A | B ، وهو عدد الجمعيات* Author Lulei*/Public Static Class Educted <Text ، Text ، Text ، {private int count ؛ this.count = integer.parseint (countstr) ؛ hashmap <string ، integer> hashMap = new hashmap <string ، integer> () ؛ // استخدم التجزئة لحساب عدد المنتجات B لـ (قيمة النص: القيم) {String Valuestr = value.toString () ؛ if (hashmap.containskey (valuestr)) {hashmap.put (valuestr ، hashmap.get (valuestr) + 1) ؛ } آخر {hashmap.put (valuestr ، 1) ؛ }} // إخراج النتيجة لـ (الإدخال <string ، integer> الإدخال: hashMap.EntrySet ()) {if (entry.getValue ()> = this.count) {// فقط الإخراج context.write (نص جديد (keystr + "| }}}} Override public int Run (string [] arg0) يلقي استثناء {// todo method method method configuration conf = getConf () ؛ conf.set ("count" ، arg0 [2]) ؛ وظيفة الوظيفة = وظيفة جديدة (conf) ؛ Job.setJobName ("JobTest") ؛ job.setOutputFormatClass (textOutputFormat.class) ؛ Job.SetOutputKeyClass (text.class) ؛ Job.SetOutputValueClass (text.class) ؛ Job.SetMapperClass (mapt.class) ؛ job.setReducerClass (leducet.class) ؛ FileInputFormat.adDinputPath (Job ، مسار جديد (Arg0 [0])) ؛ FileOutputFormat.setoutputpath (Job ، مسار جديد (Arg0 [1])) ؛ Job.WaitforCompletion (true) ؛ إرجاع Job.issucessful ()؟ 0: 1 ؛ } / ** * param args * / public static void main (string [] args) {// todo method method method tuto if (args.length! = 3) {system.exit (-1) ؛ } try {int res = toolrunner.run (configuration () جديد ، اختبار جديد () ، args) ؛ System.exit (res) ؛ } catch (استثناء e) {// todo catch e.printstacktrace () ؛ }}} تحميل وتشغيل:
قم بتعبئة البرنامج في ملف جرة وتحميله إلى مجموعة الماكينة. قم بتحميل بيانات الاختبار إلى نظام الملفات الموزع HDFS أيضًا.
تظهر لقطة شاشة الأمر في الشكل التالي:
بعد اكتمال التشغيل ، تحقق من نظام ملفات HDFS المقابل ، كما هو موضح في الشكل أدناه:
هنا برنامج MapReduce كامل. سأستمر في التعرف على Hadoop ~ شكرًا لك على القراءة ، وآمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!