2012-02-09 15 views
13

Yeni API'de (apache.hadoop.mapreduce.KeyValueTextInputFormat), anahtar ve Değer'i ayırmak için sekme dışındaki (ayırıcı) ayırıcı (sınırlayıcı) belirtme.Hadoop-.20 api'de KeyValueTextInputFormat Ayırıcı nasıl belirlenir?

Örnek Giriş:

one,first line 
two,second line 

Çıkışı Gerekli: Ben KeyValueTextInputFormat belirterek am

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

:

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

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

Bu ayırıcı olarak sekme için iyi çalışıyor.

+0

Kabul edilen yanıt düzgün çalışmıyor –

+0

@SreeVeni Benim için iyi çalışıyor. –

cevap

11

Daha yeni API'de, mapreduce.input.keyvaluelinerecordreader.key.value.separator yapılandırma özelliğini kullanmalısınız. Varsayılan olarak

+0

Yeni api için bu işe yaramaz. Burada tüm satır anahtar olarak alınacaktır –

+0

@SreeVeni Benim için iyi çalışıyor. –

+0

@ chiastic-security: bu benim için işe yaramadı, ama bu conf.set ("key.value.separator.in.input.line", ","); –

5

Lütfen Sürücü Kodunda aşağıdakileri ayarlayın.

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

Yanıt için Thanx .. Ama aslında yeni API (JobConf Object yerine Job Object) kullanıyorum. – pradeep

+0

Çözümümü güncelledim. –

0

Birincisi, yeni API 0.20'dır bitmiş olmadı. * Eğer 0,20 yeni API kullanmak isteyen eğer öyleyse. *, Size ulaşmak için FileInputFormat kullanabilirsiniz yourself.For örnek özelliğini uygulamalıdır. LongWritable anahtarını yok sayın ve Metin değerini virgülle kendiniz ayırın.

0

, KeyValueTextInputFormat sınıf giriş metin dosyasından anahtar ve değer için ayırıcı olarak sekme kullanır:

İşte bir örnek.

Girişi özel bir ayırıcıdan okumak isterseniz, yapılandırmayı kullanmakta olduğunuz öznitelikle ayarlamanız gerekir.

yeni Hadoop'un ilaç aktif maddeleri için

, bu farklıdır: giriş hattı ile "\ t"

Key1  Value1,Value2 

ayrılmış bir anahtar değeri çifti olmalıdır

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

KeyValueTextInputFormatiçin varsayılan ayırıcıyı değiştirme, dilediğiniz gibi okuyabileceksiniz. Yeni 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); 

Harita

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()); 
    . 
    . 

Çıktı

key---> one 
value---> first line 
key---> two 
value---> second line 
1

Bu bir dizi meselesi için

.

conf.set("key.value.separator.in.input.line", ",") numaralı ilk satır, Job sınıfının bir örneğini oluşturmadan önce gelmelidir.Yani:

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