В последние дни я читал книги, связанные с Хадоу, в последние дни. Я чувствую себя немного таким, поэтому я написал статистически связанный продукт, имитируя программу WordCount.
Описание требования:
Согласно списку продаж супермаркета, рассчитайте степень корреляции между товарами (то есть подсчитывайте количество раз, когда вы покупаете товары и товары B одновременно).
Формат данных:
Список продаж супермаркетов упрощен до следующего формата: строка представляет список, и каждый продукт делится на «», как показано на рисунке ниже:
Анализ требований:
Используйте MapReduce в Hadoop, чтобы рассчитать это требование.
Функция карты в основном разбивает связанные продукты, результатом выходного выхода является то, что ключом является продукт A, а значение - продукт B. Результат разделения для первого и трех результатов показан на рисунке ниже:
Чтобы подсчитать продукты, которые связаны с двумя продуктами A и B, взаимосвязь между продуктами A и B выводит два результата, а именно AB и BA.
Функция снижения сгруппировала и подсчитала продукты, связанные с продуктом A, то есть для расчета количества раз, когда каждый продукт появляется в значении, и результатом выходного выходного данных является то, что ключом является продукт A | Продукт B, и значение - количество раз, когда эта комбинация происходит. Для 5, упомянутых выше, проанализируйте значение ключа R в выводе карты:
Благодаря обработке функции карты получается запись, показанная на рисунке ниже:
Выход значения в снижении сгруппируется и подсчитывается, и результат показан на рисунке ниже.
Используйте продукт AB в качестве ключа, объедините количество продуктов в качестве значения для вывода, и результат вывода показан на рисунке ниже:
Анализ процесса реализации требований закончился до сих пор. Давайте посмотрим на конкретную реализацию кода ниже.
Реализация кода:
Я не дам подробного введения в код, пожалуйста, обратитесь к комментариям в коде для получения подробной информации.
пакет com; импортировать 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; Import org.apache.hadoop.io.intwritable; Импорт org.apache.hadoop.io.longwrable; Импорт 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; Import org.apache.hadoop.mapreduce.lib.output.fileOutputFormat; import org.apache.hadoop.mapreduce.lib.output.textOutputFormat; Импорт org.apache.hadoop.util.tool; Импорт 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)) {// разделить строку продукта [] vs = line.split (","); // Объединение двух, чтобы сформировать запись для (int i = 0; i <(vs.length - 1); i ++) {if (".. equals (vs]) {/exclide for at (if (". vs.length; Ключ -результат - это значение A | B, которое является количеством ассоциаций* @author lulei*/public static class educet расширяет восстановление <текст, текст, текст, Intwritable> {private int count; Integer.parseint (countstr); HashMap <String, Integer> hashmap = new HashMap <String, Integer> (); // Использование хэша для подсчета количества раз B -продуктов для (текстовое значение: значения) {string valuest = value.toString (); if (hashmap.containskey (valuestr)) {hashmap.put (valuestr, hashmap.get (valuestr) + 1); } else {hashmap.put (valuestr, 1); }} // Выход результат для (intpirt <string, integer> intry: hashmap.entryset ()) {if (entry.getvalue ()> = this.count) {// только выходной контекст. }}}} @Override public int run (string [] arg0) бросает исключение {// todo с генерируемым методом конфигурации метода 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 (Reducet.class); FileInputFormat.AddInputPath (job, новый путь (arg0 [0])); FileOutputFormat.setOutPutPath (abob, новый путь (arg0 [1])); job.waitforcompletion (true); return job.issuccessful ()? 0: 1; } / ** * @param args * / public static void main (string [] args) {// todo автоматически сгенерированный метод if (args.length! = 3) {System.Exit (-1); } try {int res = toolrunner.run (new configuration (), new test (), args); System.exit (res); } catch (Exception e) {// todo автоматически сгенерированный блок e.printstacktrace (); }}} Загрузить и запустить:
Упакуйте программу в файл JAR и загрузите ее в группу машины. Загрузите тестовые данные в распределенную файловую систему HDFS.
Снимок экрана запуска команды показан на следующем рисунке:
После завершения выполнения проверьте соответствующую файловую систему HDFS, как показано на рисунке ниже:
Вот полная программа MapReduce. Я буду продолжать узнать о Hadoop ~ Спасибо за чтение, я надеюсь, что это поможет вам. Спасибо за поддержку этого сайта!