Nano Hash - криптовалюты, майнинг, программирование

Как переопределить сортировку Hadoop по умолчанию

У меня есть задание map-reduce, в котором ключами являются числа от 1 до 200. Мой предполагаемый результат был (число,значение) в порядке номеров. Но я получаю вывод как:

1    value
10   value
11   value
   :
   : 
2    value
20   value
   :
   :
3    value

Я знаю, что это связано с поведением Map-Reduce по умолчанию для сортировки ключей в порядке возрастания.

Я хочу, чтобы мои ключи были отсортированы только в числовом порядке. Как я могу этого добиться?

06.03.2015

  • как вы запускаете mapreduce? 06.03.2015
  • Привет, твой вопрос попал ко мне в очередь на редактирование. Я немного отредактировал его, убрав, например, знак в конце. Однако основная проблема с вопросом заключается в том, что он не показывает ваш код того, как вы используете mapreduce. Вам нужно добавить это, чтобы люди могли помочь понять, почему ключи сортируются в лексографическом порядке, а не в числовом, и помочь вам исправить это. Если вы добавите эту информацию, вы, вероятно, получите лучшую помощь. 06.03.2015

Ответы:


1

Значение по умолчанию WritableComparator в среде MapReduce обычно обрабатывает ваш числовой порядок, если ключ был IntWritable. Я подозреваю, что он получает ключ Text, что приводит к лексикографическому упорядочению в вашем случае. Пожалуйста, взгляните на пример кода, который использует ключ IntWritable для передачи значений:

1) Реализация картографа

package com.stackoverflow.answers.mapreduce;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;

public class SourceFileMapper extends Mapper<LongWritable, Text, IntWritable, Text> {

    private static final String DEFAULT_DELIMITER = "\t";

    private IntWritable keyToEmit = new IntWritable();
    private Text valueToEmit = new Text();

    public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
        String line = value.toString();
        keyToEmit.set(Integer.parseInt(line.split(DEFAULT_DELIMITER)[0]));
        valueToEmit.set(line.split(DEFAULT_DELIMITER)[1]);
        context.write(keyToEmit, valueToEmit);
    }

}

2) Реализация редуктора

package com.stackoverflow.answers.mapreduce;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

public class SourceFileReducer extends Reducer<IntWritable, Text, IntWritable, Text> {

    public void reduce(IntWritable key, Iterable<Text> values, Context context) throws IOException,
            InterruptedException {
        for (Text value : values) {
            context.write(key, value);
        }
    }

}

3) Реализация драйвера

package com.stackoverflow.answers.mapreduce;

import java.io.IOException;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.FileSystem;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;

public class SourceFileDriver {

    public static void main(String[] args) throws IOException, InterruptedException, ClassNotFoundException {

        Path inputPath = new Path(args[0]);
        Path outputDir = new Path(args[1]);

        // Create configuration
        Configuration conf = new Configuration(true);

        // Create job
        Job job = new Job(conf, "SourceFileDriver");
        job.setJarByClass(SourceFileDriver.class);

        // Setup MapReduce
        job.setMapperClass(SourceFileMapper.class);
        job.setReducerClass(SourceFileReducer.class);
        job.setNumReduceTasks(1);

        // Specify key / value
        job.setOutputKeyClass(IntWritable.class);
        job.setOutputValueClass(Text.class);

        // Input
        FileInputFormat.addInputPath(job, inputPath);
        job.setInputFormatClass(TextInputFormat.class);

        // Output
        FileOutputFormat.setOutputPath(job, outputDir);
        job.setOutputFormatClass(TextOutputFormat.class);

        // Delete output if exists
        FileSystem hdfs = FileSystem.get(conf);
        if (hdfs.exists(outputDir))
            hdfs.delete(outputDir, true);

        // Execute job
        int code = job.waitForCompletion(true) ? 0 : 1;
        System.exit(code);

    }

}

Благодарю вас!

06.03.2015
  • Мне нужно вывести один ключ как текст. Вот почему я использовал текст вместо IntWritable. В моей работе одним ключом должен быть текст. Учитывая это требование, как я могу найти решение? – 07.03.2015

  • 2

    Если бы мне пришлось предположить, я бы сказал, что вы храните свои числа как объекты Text, а не как объекты IntWritable.

    В любом случае, если у вас есть более одного редюсера, будут отсортированы только элементы внутри редуктора, но не полностью.

    06.03.2015
  • Мне нужно вывести один ключ как текст. Вот почему я использовал текст вместо IntWritable. В моей работе одним ключом должен быть текст. Учитывая это требование, как я могу найти решение? 07.03.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..