[HADOOP] Hadoop-.20 API에서 KeyValueTextInputFormat Separator를 지정하는 방법
HADOOPHadoop-.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.새로운 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.드라이버 코드에서 다음을 설정하십시오.
드라이버 코드에서 다음을 설정하십시오.
conf.set("key.value.separator.in.input.line", ",");
-
==============================
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.순서 문제입니다.
순서 문제입니다.
첫 번째 줄 conf.set ( "key.value.separator.in.input.line", ",")은 Job 클래스의 인스턴스를 만들기 전에 와야합니다. 그래서:
conf.set("key.value.separator.in.input.line", ","); Job job = new Job(conf);
-
==============================
5.첫째, 새로운 API는 0.20. *에서 완료되지 않았습니다. 따라서 0.20. *에서 새 API를 사용하려면 직접 구현해야합니다. 예를 들어 FileInputFormat을 사용하여 달성 할 수 있습니다. LongWritable 키를 무시하고 텍스트 값을 쉼표로 직접 나눕니다.
첫째, 새로운 API는 0.20. *에서 완료되지 않았습니다. 따라서 0.20. *에서 새 API를 사용하려면 직접 구현해야합니다. 예를 들어 FileInputFormat을 사용하여 달성 할 수 있습니다. LongWritable 키를 무시하고 텍스트 값을 쉼표로 직접 나눕니다.
-
==============================
6.기본적으로 KeyValueTextInputFormat 클래스는 탭을 입력 텍스트 파일의 키 및 값에 대한 구분 기호로 사용합니다.
기본적으로 KeyValueTextInputFormat 클래스는 탭을 입력 텍스트 파일의 키 및 값에 대한 구분 기호로 사용합니다.
사용자 정의 분리 기호에서 입력을 읽으려면 사용중인 속성으로 구성을 설정해야합니다.
새로운 Hadoop API의 경우 다른 점이 있습니다.
conf.set("mapreduce.input.keyvaluelinerecordreader.key.value.separator", ";");
-
==============================
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)); } }
from https://stackoverflow.com/questions/9211151/how-to-specify-keyvaluetextinputformat-separator-in-hadoop-20-api by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] Hadoop Map Reduce에서 파트 파일 이름 바꾸기 (0) | 2019.06.03 |
---|---|
[HADOOP] 정확히 DFS가 아닌 것은 의미합니까? (0) | 2019.06.03 |
[HADOOP] hadoop 2에서 hadoop jar 파일은 어디에 있습니까? [닫은] (0) | 2019.06.03 |
[HADOOP] HIVE 시작시 java.net.URISyntaxException (0) | 2019.06.02 |
[HADOOP] hadoop에서 SUCCESS 및 part-r-00000 파일이란 무엇입니까? (0) | 2019.06.02 |