Вывод сопоставителя как значение, разделенное запятыми

hadoop mapreduce

525 просмотра

2 ответа

3 Репутация автора

У меня есть файл CSV, как показано ниже. Я пишу программу mapReduce, которая рассчитывает продукт, который был продан максимум в определенный день.

Данные CSV

Для этого вывод картографа должен иметь вид

1/2/09 => [Product1, Product2, Product1, Product2, product4, .....]

Я написал код Mapper как ниже

public void map(LongWritable key, Text value, OutputCollector<Text, Text> output, Reporter reporter)
        throws IOException {

    String line = value.toString();
    String[] arrLine = line.split(",");

    String strDateTime        = arrLine[0];     
    String strDate  = strDateTime.substring(0, strDateTime.indexOf(" ")); 
    String strProductName = arrLine[1];

    Map products = new HashMap<String, String>();
    String strProdAdded = null;

    if(products.get(strDate)!= null)
    {
        strProdAdded = products.get(strDate).toString();
        strProdAdded += strProductName + ",";
        products.put(strDate, strProdAdded);
    }else
    {
        products.put(strDate, strProductName);
    }

    output.collect(new Text(strDate), new Text(strProductName));
}

Но я не могу понять точный способ получить желаемый результат, как показано ниже

1/2/09 => [Product1, Product2, Product1, Product2, product4, .....]

Автор: Mugil Источник Размещён: 18.07.2016 12:38

Ответы (2)


0 плюса

721 Репутация автора

Результат, который вы ожидаете, по моему мнению, может быть результатом работы Reduce. По сути, это реализация запроса даты GroupBy, и, насколько я понимаю, она обрабатывается за счет сокращения заданий. Я полагаю, что для вашей программы вы выводите правильный ключ и значения из вашей карты. Как только они отсортированы, перемешаны и переданы редуктору, вы сможете увидеть все продукты на определенную дату, сгруппированные вместе.

PS Если бы у меня был шанс, я бы использовал Pig или Hive для решения этой проблемы, если вы не делаете это в качестве упражнения, чтобы попробовать свои силы в Map-Reduce.

Автор: Amit Размещён: 18.07.2016 01:46

0 плюса

3683 Репутация автора

Решение

вам придется использовать cleanup()метод, я добавил System.outоператоры, чтобы вы могли понять, что происходит в методе. посмотрите доступные методы, которые вы можете использовать для класса Mapper здесь.

public static class StackMapper extends Mapper<Object, Text, Text, Text> {

        private Map<Text, ArrayList<Text>> products = new HashMap<Text, ArrayList<Text>>();
        private ArrayList<Text> p = new ArrayList<Text>();

        @Override
        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

               String line = value.toString();
               String[] arrLine = line.split(",");

               Text strDate  = new Text(arrLine[0].substring(0, arrLine[0].indexOf(" "))); 
               Text strProductName = new Text(arrLine[1]);

               if(products.containsKey(strDate))
                {
                    if(!products.get(strDate).contains(strProductName)) {
                        System.out.println("has date: " + strDate + " " + strProductName + " not exist, added to list: " + p.toString());
                        p.add(strProductName);
                    }  
                    System.out.println("has date: " + strDate + ", "  + strProductName + " added to list: " + p.toString());      
                }else
                {
                    p = new ArrayList<Text>();
                    p.add(strProductName);

                    System.out.println("new date: " + strDate + ", " + strProductName + " added to list: " + p.toString());  
                }

               products.put(new Text(strDate), p);   
        }  

        @Override
        protected void cleanup(Context context)
                throws IOException, InterruptedException {
            for ( Text date : products.keySet()){
                context.write(date, new Text(products.get(date).toString()));
            }

        }
    }

вход:

1/2/09 6:17,product1,f3,f4,f5
1/2/09 6:17,product2,f3,f4,f5
1/2/09 6:17,product3,f3,f4,f5
1/2/09 6:17,product4,f3,f4,f5
1/2/09 6:17,product4,f3,f4,f5
1/2/10 6:17,product1,f3,f4,f5u
1/2/10 6:17,product2,f3,f4,f5u
1/2/10 6:17,product3,f3,f4,f5u
1/2/11 6:17,product2,f3,f4,f5u
1/2/12 6:17,product2,f3,f4,f5u
1/2/12 6:17,product3,f3,f4,f5u

выход:

1/2/09  [product1, product2, product3, product4]
1/2/10  [product1, product2, product3]
1/2/12  [product2, product3]
1/2/11  [product2]

Вывод стандартного задания задания MR:

new date: 1/2/09, product1 added to list: [product1]
has date: 1/2/09 product2 not exist, added to list: [product1]
has date: 1/2/09, product2 added to list: [product1, product2]
has date: 1/2/09 product3 not exist, added to list: [product1, product2]
has date: 1/2/09, product3 added to list: [product1, product2, product3]
has date: 1/2/09 product4 not exist, added to list: [product1, product2, product3]
has date: 1/2/09, product4 added to list: [product1, product2, product3, product4]
has date: 1/2/09, product4 added to list: [product1, product2, product3, product4]
new date: 1/2/10, product1 added to list: [product1]
has date: 1/2/10 product2 not exist, added to list: [product1]
has date: 1/2/10, product2 added to list: [product1, product2]
has date: 1/2/10 product3 not exist, added to list: [product1, product2]
has date: 1/2/10, product3 added to list: [product1, product2, product3]
new date: 1/2/11, product2 added to list: [product2]
new date: 1/2/12, product2 added to list: [product2]
has date: 1/2/12 product3 not exist, added to list: [product2]
has date: 1/2/12, product3 added to list: [product2, product3]
Автор: Ronak Patel Размещён: 18.07.2016 02:44
Вопросы из категории :
32x32