2012-09-14 25 views
10

varsayalım ben bir sekme böyle biçimlendirilmiş kullanıcı etkinliği verilerini içeren dosyayı ayrılmış vardır:Hadoop - kompozit anahtar

timestamp user_id page_id action_id 

Ben her sayfada kullanıcı eylemleri saymak için bir Hadoop işi yazmak istiyorum, bu yüzden çıktı dosyası görünmelidir böyle:

user_id page_id number_of_actions 

burada kompozit anahtar gibi bir şey gerekiyor - bu user_id ve PAGE_ID içerecektir. Bunu hadoop ile yapmak için herhangi bir genel yolu var mı? Yardımcı bir şey bulamadım.

context.write(new Text(user_id + "\t" + page_id), one); 

O inşaat, ama en iyi çözüm olmadığını hissetmek: Şimdiye kadar eşleştiricisindeki böyle anahtarını yayan ediyorum.

cevap

13

Sadece Writable Kendi oluşturmasına. Örnekte bir çözüm bu gibi görünebilir:

public class UserPageWritable implements WritableComparable<UserPageWritable> { 

    private String userId; 
    private String pageId; 

    @Override 
    public void readFields(DataInput in) throws IOException { 
    userId = in.readUTF(); 
    pageId = in.readUTF(); 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    out.writeUTF(userId); 
    out.writeUTF(pageId); 
    } 

    @Override 
    public int compareTo(UserPageWritable o) { 
    return ComparisonChain.start().compare(userId, o.userId) 
     .compare(pageId, o.pageId).result(); 
    } 

} 

Ben senin kimlikleri long olabileceğini düşünüyorum rağmen, burada String sürümü var. Temel olarak sadece Writable arabirimindeki normal serileştirme, varsayılan kurucuya ihtiyaç duyduğuna dikkat edin, böylece her zaman bir tane sağlamanız gerekir.

compareTo mantığı, veri kümesinin nasıl sıralanacağını ve redüktöre hangi öğelerin eşit olduğunu, böylece gruplandırılabileceğini söyler.

ComparisionChainGuava'un güzel bir kullanımıdır.

Eşittir ve hashcode'u geçersiz kılmayı unutmayın! Bölümleyici indirgeyiciyi anahtarın hash koduyla belirleyecektir.

+0

ComparisionChain bu kullanım durumu için gerçekten kolaylık sağlar. Teşekkürler –

1

İki alanınızı karşılaştırabileceğiniz Yazılabilir ve Yazılabilir Eşlemler uygulayan kendi sınıfınızı yazabilirsiniz.

Pierre-Luc Bertrand