2012-03-15 14 views
5

Hadoop'un metinden CustomWritable ayrıştırmak nasıl

#userid; unix-timestamp; value 
1; 2010-01-01 00:00:00; 10 
2; 2010-01-01 00:00:00; 20 
1; 2010-01-01 01:00:00; 11 
2; 2010-01-01 01:00:00, 21 
1; 2010-01-02 00:00:00; 12 
2; 2010-01-02 00:00:00; 22 

gibi özel bir sınıf "SessionSummary" WritableComparable yazma readFields ve uygulayan var, metin dosyalarında belirli kullanıcılar için timestamped değerlere sahip Say. Amaç, her takvim günü için kullanıcı başına tüm değerleri toplamaktır.

Böylece eşleyicisi, her bir kullanıcı için çizgiler, haritalar redüktör Kullanıcı başına günde tüm değerleri özetler ve (sekme ayrılmış UTF-8 dizeleri olarak, SessionSummary arasında toString kullanılarak) TextOutputFormat gibi bir SessionSummary verir:

1; 2010-01-01; 21 
2; 2010-01-01; 41 
1; 2010-01-02; 12 
2; 2010-01-02; 22 

İkinci bir Harita/Küçültme aşaması için bu özet girişleri kullanmam gerekirse, üyeleri özetlemek için bu özet verileri nasıl ayrıştırmalıyım? Varolan readFields ve yazma yöntemlerini (WritableComparable arabirim uygulamasının) bir şekilde String DataInput bir şekilde kullanabilir miyim? Bu (besbelli) işe yaramadı: Genel olarak

public void map(...) { 
    SessionSummary ssw = new SessionSummary(); 
    ssw.readFields(new DataInputStream(new ByteArrayInputStream(value.getBytes("UTF-8")))); 
} 

: insan tarafından okunabilir bir metin tutarken, Hadoop özel anahtarlar ve değerler uygulamak ve çeşitli M/R aşamalar boyunca onları kolayca yeniden kullanılabilir hale getirmek için en iyi yöntem var mı her aşamada çıktı?

(Hadoop sürümü 0.20.2/CDH3u3)

cevap

8

ilk MR işi için çıkış biçimi olmalıdır SequenceFileOutputFormat - Bu o zaman can, bir ikili formatta redüktör Key/Değerler çıkışını saklayacak SequenceFileInputFormat kullanarak ikinci MR işinizde tekrar okunabilir. Ayrıca JoboutputKeyClass ve outputValueClass'u ayarladığınızdan emin olun.

ikinci işte mapper sonra sahip SessionSummary ilk MR işinden metinsel çıkışını görmeniz gerekiyorsa (ve değer tipi ne olursa olsun)

, sen HDF'ler çıktı dosyalarına aşağıdaki çalıştırabilirsiniz : stdout'a çıkartırken

hadoop fs -libjars my-lib.jar -text output-dir/part-r-* 

Bu dizi dosya Anahtar/Değer çiftleri okumak ve her iki nesneler üzerinde toString() arayacak, sekme ayırarak. -libjars, hadoop'un özel Anahtar/Değer sınıflarınızı nerede bulabileceğini belirtir

+1

Teşekkürler Chris! Böylece ikinci MR işi için conf.setInputFormat (SequenceFileInputFormat.class) ayarını yaptım ve Mapper anahtar ve değer sınıfları ilk Reducer'in çıkışındakiyle aynı mı, doğru mu? – thomers

+0

Bu doğru. –

+0

İkinci MR işi için Mapper anahtarını ve değer sınıflarını açık bir şekilde nasıl belirlerim? IdentityMapper ile test ediyorum ve Metin anahtar olarak bekliyor. – thomers

İlgili konular