Несколько выходных файлов для потоковой передачи Hadoop с помощью Python Mapper

Я хочу немного пояснить ответы на этот вопрос здесь:

Создание отдельных выходных файлов в потоке Hadoop

Мой вариант использования выглядит следующим образом:

У меня есть задание mapreduce только для карт, которое берет входной файл, выполняет много разбора и перебора, а затем записывает обратно. Однако некоторые строки могут быть или не быть в неправильном формате, и если это так, я хотел бы написать оригинальную строку в отдельный файл.

Кажется, что одним из способов сделать это было бы добавить имя файла в строку, которую я печатаю, и использовать параметр multipleOutputFormat. Например, если я изначально имел:

if line_is_valid(line): print name + '\t' + comments 

Я мог бы сделать:

 if line_is_valid(line): print valid_file_name + '\t' + name + '\t' + comments else: print err_file_name + '\t' + line 

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

1) Является ли это правильным способом управления несколькими выходными файлами с помощью задания на создание python mapreduce?

2) Каков наилучший способ избавиться от этого начального столбца?

One Solution collect form web for “Несколько выходных файлов для потоковой передачи Hadoop с помощью Python Mapper”

Вы можете сделать что-то вроде следующего, но это связано с небольшим компиляцией Java, который, я думаю, не должен быть проблемой, если вы хотите, чтобы ваш случай использования делался в любом случае с Python-From Python, насколько я знаю, это невозможно пропустите имя файла из конечного результата, как ваш запрос использования в одном задании. Но то, что показано ниже, позволяет сделать это с легкостью!

Вот класс Java, который необходимо скомпилировать –

 package com.custom; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapred.lib.MultipleTextOutputFormat; public class CustomMultiOutputFormat extends MultipleTextOutputFormat<Text, Text> { /** * Use they key as part of the path for the final output file. */ @Override protected String generateFileNameForKeyValue(Text key, Text value, String leaf) { return new Path(key.toString(), leaf).toString(); } /** * We discard the key as per your requirement */ @Override protected Text generateActualKey(Text key, Text value) { return null; } } 

Шаги для компиляции:

  1. Сохраняйте текст в файл точно (без другого имени) CustomMultiOutputFormat.java
  2. Пока вы находитесь в каталоге, где находится указанный выше сохраненный файл, введите –

    $JAVA_HOME/bin/javac -cp $(hadoop classpath) -d . CustomMultiOutputFormat.java

  3. Убедитесь, что JAVA_HOME установлен в / path / to / your / SUNJDK, прежде чем пытаться выполнить указанную выше команду.

  4. Создайте свой файл custom.jar, используя (введите точно) –

    $JAVA_HOME/bin/jar cvf custom.jar com/custom/CustomMultiOutputFormat.class

  5. Наконец, запустите свою работу, как –

    hadoop jar /path/to/your/hadoop-streaming-*.jar -libjars custom.jar -outputformat com.custom.CustomMultiOutputFormat -file your_script.py -input inputpath --numReduceTasks 0 -output outputpath -mapper your_script.py

После этого вы должны увидеть две директории внутри вашего пути вывода с именем valid_file_name и другим с именем err_file_name . Все записи, имеющие valid_file_name как тег, перейдут в каталог valid_file_name, и все записи, имеющие имя err_file_name, перейдут в каталог err_file_name.

Надеюсь, все это имеет смысл.

  • subprocess.check_output () имеет атрибут 'check_output'
  • Как начать работу с крупным анализом данных
  • Анализ данных на основе времени с помощью Python
  • Рабочие потоки Hadoop SUCCEEDED, но убиты ApplicationMaster
  • Список всех файлов, доступных в Spark-кластере, хранящихся на Hadoop HDFS с использованием Scala или Python?
  • spark-submit продолжает зависать после завершения работы
  • Pyspark --py-файлы не работают
  • Как включить пакет python с потоковой работой Hadoop?
  • Pydoop на Amazon EMR
  • карта hadoop сокращает время на ведение
  • RDD имеет только первое значение столбца: Hbase, PySpark
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.