Перестановки с MapReduce - PullRequest
4 голосов
/ 30 июня 2011

Есть ли способ генерировать перестановки с помощью MapReduce?

входной файл:

1  title1
2  title2
3  title3

моя цель:

1,2  title1,title2
1,3  title1,title3
2,3  title2,title3

1 Ответ

5 голосов
/ 30 июня 2011

Поскольку файл будет иметь n входных данных, перестановки должны иметь n^2 выходных данных. Имеет смысл, что вы могли бы n задач выполнить n из этих операций. Я полагаю, что вы могли бы сделать это (если только для одного файла):

Поместите ваш входной файл в DistributedCache , чтобы он был доступен только для чтения вашим картостроителям / редукторам. Сделайте разделение ввода в каждой строке файла (как в WordCount). Таким образом, маппер получит одну строку (например, title1 в вашем примере). Затем прочитайте строки из файла в DistributedCache и создайте пары ключ / значение: с ключом в качестве ввода и значениями в качестве каждой строки из файла из DistributedCache.

В этой модели вам нужен только шаг Map.

Что-то вроде:

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

    private static final IN_FILENAME="file.txt";

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

      String inputLine = value.toString();

      // set the property mapred.cache.files in your
      // configuration for the file to be available
      Path[] cachedPaths = DistributedCache.getLocalCacheArchives(conf);
      if ( cachedPaths[0].getName().equals(IN_FILENAME) ) {
         // function defined elsewhere
         String[] cachedLines = getLinesFromPath(cachedPaths[0]);
         for (String line : cachedLines)
           context.emit(inputLine, line);
      }
    }
  }
...