2012-02-09 44 views
13

在新的API(apache.hadoop.mapreduce.KeyValueTextInputFormat)中,如何指定分隔符(分隔符)而不是tab(默認值)來分隔鍵和值。如何在Hadoop -.20 api中指定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")); 

這是爲選項卡作爲分隔符正常工作。

+0

接受的答案是不正常工作 – 2014-09-29 09:36:27

+0

@SreeVeni它對我來說很好。 – 2015-01-19 09:36:28

回答

11

在較新的API中,您應該使用mapreduce.input.keyvaluelinerecordreader.key.value.separator配置屬性。

下面是一個例子:

+0

對於新的API這不會工作。在這裏,整個行將被視爲關鍵 – 2014-09-29 09:31:07

+0

@SreeVeni它適用於我。 – 2015-01-19 09:35:56

+0

@ chiastic-security:沒有爲我工作,但這確實conf.set(「key.value.separator.in.input.line」,「,」); – 2015-01-19 14:37:20

5

請在驅動程序代碼中設置以下內容。

conf.set("key.value.separator.in.input.line", ","); 
+0

Thanx爲d響應.. 但實際上我使用新的API(作業對象,而不是JobConf對象)。 – pradeep 2012-02-10 04:17:21

+0

我已更新我的解決方案。 – 2012-02-10 23:21:47

0

首先,新的API並沒有完成0.20 *所以如果你想在0.20使用新的API。*,你應該落實yourself.For例如功能,您可以使用FileInputFormat來實現。 忽略LongWritable鍵,並自己將逗號分割爲Text值。

0

默認情況下,KeyValueTextInputFormat類使用選項卡,從輸入文本文件鍵和值的分隔符。

如果您想讀取自定義分隔符的輸入,則必須使用您正在使用的屬性來設置配置。

對於新的Hadoop的API,它是不同的:

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

對於KeyValueTextInputFormat輸入線應該是一個關鍵值對由「\ t」 的

Key1  Value1,Value2 

分隔通過改變默認分隔符,你將能夠閱讀你想要的。

對於新的API

Here is the solution

//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 
1

這是一個順序問題。

第一行conf.set("key.value.separator.in.input.line", ",")必須在創建Job類的實例之前出現。所以:

conf.set("key.value.separator.in.input.line", ","); 
Job job = new Job(conf); 
相關問題