복붙노트

[HADOOP] Hadoop-.20 API에서 KeyValueTextInputFormat Separator를 지정하는 방법

HADOOP

Hadoop-.20 API에서 KeyValueTextInputFormat Separator를 지정하는 방법

새 API (apache.hadoop.mapreduce.KeyValueTextInputFormat)에서 키와 값을 구분하는 탭 (기본값) 이외의 구분 기호 (구분 기호)를 지정하는 방법

샘플 입력 :

one,first line
two,second line

필요한 출력 :

Key : one
Value : first line
Key : two
Value : second line

KeyValueTextInputFormat을 다음과 같이 지정합니다.

    Job job = new Job(conf, "Sample");

    job.setInputFormatClass(KeyValueTextInputFormat.class);
    KeyValueTextInputFormat.addInputPath(job, new Path("/home/input.txt"));

이것은 구분 기호로 탭에 대해 잘 작동합니다.

해결법

  1. ==============================

    1.새로운 API에서는 mapreduce.input.keyvaluelinerecordreader.key.value.separator 구성 속성을 사용해야합니다.

    새로운 API에서는 mapreduce.input.keyvaluelinerecordreader.key.value.separator 구성 속성을 사용해야합니다.

    다음은 그 예입니다.

    Configuration conf = new Configuration();
    conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ",");
    
    Job job = new Job(conf);
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    // next job set-up
    
  2. ==============================

    2.드라이버 코드에서 다음을 설정하십시오.

    드라이버 코드에서 다음을 설정하십시오.

    conf.set("key.value.separator.in.input.line", ",");
    
  3. ==============================

    3.KeyValueTextInputFormat의 경우 입력 행은 "\ t"로 구분 된 키 값 쌍이어야합니다.

    KeyValueTextInputFormat의 경우 입력 행은 "\ t"로 구분 된 키 값 쌍이어야합니다.

    Key1     Value1,Value2
    

    기본 분리 기호를 변경하면 원하는대로 읽을 수 있습니다.

    새로운 Api를 위해

    여기에 해결책이있다.

    //New API
    Configuration conf = new Configuration();
    conf.set("key.value.separator.in.input.line", ","); 
    Job job = new Job(conf);
    job.setInputFormatClass(KeyValueTextInputFormat.class);
    

    지도

    public class Map extends Mapper<Text, Text, Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();
    
    public void map(Text key, Text value, Context context)
            throws IOException, InterruptedException {
        String line = value.toString();
        System.out.println("key---> "+key);
        System.out.println("value---> "+value.toString());
       .
       .
    

    산출

    key---> one
    value---> first line
    key---> two
    value---> second line
    
  4. ==============================

    4.순서 문제입니다.

    순서 문제입니다.

    첫 번째 줄 conf.set ( "key.value.separator.in.input.line", ",")은 Job 클래스의 인스턴스를 만들기 전에 와야합니다. 그래서:

    conf.set("key.value.separator.in.input.line", ","); 
    Job job = new Job(conf);
    
  5. ==============================

    5.첫째, 새로운 API는 0.20. *에서 완료되지 않았습니다. 따라서 0.20. *에서 새 API를 사용하려면 직접 구현해야합니다. 예를 들어 FileInputFormat을 사용하여 달성 할 수 있습니다. LongWritable 키를 무시하고 텍스트 값을 쉼표로 직접 나눕니다.

    첫째, 새로운 API는 0.20. *에서 완료되지 않았습니다. 따라서 0.20. *에서 새 API를 사용하려면 직접 구현해야합니다. 예를 들어 FileInputFormat을 사용하여 달성 할 수 있습니다. LongWritable 키를 무시하고 텍스트 값을 쉼표로 직접 나눕니다.

  6. ==============================

    6.기본적으로 KeyValueTextInputFormat 클래스는 탭을 입력 텍스트 파일의 키 및 값에 대한 구분 기호로 사용합니다.

    기본적으로 KeyValueTextInputFormat 클래스는 탭을 입력 텍스트 파일의 키 및 값에 대한 구분 기호로 사용합니다.

    사용자 정의 분리 기호에서 입력을 읽으려면 사용중인 속성으로 구성을 설정해야합니다.

    새로운 Hadoop API의 경우 다른 점이 있습니다.

    conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ";");
    
  7. ==============================

    7.예

    public class KeyValueTextInput extends Configured implements Tool {
        public static void main(String args[]) throws Exception {
            String log4jConfPath = "log4j.properties";
            PropertyConfigurator.configure(log4jConfPath);
            int res = ToolRunner.run(new KeyValueTextInput(), args);
            System.exit(res);
        }
    
        public int run(String[] args) throws Exception {
    
            //conf.set("key.value.separator.in.input.line", ",");
    
            Job job = Job.getInstance(conf, "WordCountSampleTemplate");
            job.setJarByClass(KeyValueTextInput.class);
            job.setMapperClass(Map.class);
            job.setReducerClass(Reduce.class);
    
            //job.setMapOutputKeyClass(Text.class);
            //job.setMapOutputValueClass(Text.class);
            job.setOutputKeyClass(Text.class);
            job.setOutputValueClass(Text.class);
    
            job.setInputFormatClass(KeyValueTextInputFormat.class);
            job.setOutputFormatClass(TextOutputFormat.class);
            FileInputFormat.addInputPath(job, new Path(args[0]));
            Path outputPath = new Path(args[1]);
            FileSystem fs = FileSystem.get(new URI(outputPath.toString()), conf);
            fs.delete(outputPath, true);
            FileOutputFormat.setOutputPath(job, outputPath);
            return job.waitForCompletion(true) ? 0 : 1;
        }
    }
    
    class Map extends Mapper<Text, Text, Text, Text> {
        public void map(Text k1, Text v1, Context context) throws IOException, InterruptedException {
            context.write(k1, v1);
        }
    }
    
    class Reduce extends Reducer<Text, Text, Text, Text> {
        public void reduce(Text Key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
            String sum = " || ";
            for (Text value : values)
                sum = sum + value.toString() + " || ";
            context.write(Key, new Text(sum));
        }
    }
    
  8. from https://stackoverflow.com/questions/9211151/how-to-specify-keyvaluetextinputformat-separator-in-hadoop-20-api by cc-by-sa and MIT license