2012-09-14 3 views
10

가정하자 나는 탭은 다음과 같은 형식의 사용자 활동 데이터가 포함 된 파일을 구분 있습니다하둡 - 복합 키

timestamp user_id page_id action_id 

내가 각 페이지에 대한 사용자의 동작을 계산하기 위해 하둡 작업을 쓰고 싶어를, 그래서 출력 파일이 보일 것입니다 같은 :

user_id page_id number_of_actions 

여기 복합 키와 같은 뭔가가 필요 -이 USER_ID 및 페이지 ID를 포함하는 것입니다. hadoop으로 이것을 수행하는 일반적인 방법이 있습니까? 도움이되는 것을 찾지 못했습니다.

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

그것은 작동하지만, 나는 그것이 최선의 해결책이 아니다 느낌 : 지금까지 나는 매퍼에서이 같은 키를 방출하고있다.

답변

13

그냥 Writable 자신을 구성한다. 당신의 예에서 해결책은 다음과 같이 수 :

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

} 

을 나는 당신의 아이디가 long이 될 수 있다고 생각하지만, 여기 당신이 String 버전이있다. 기본적으로 Writable 인터페이스를 통한 일반적인 직렬화는 기본 생성자가 필요하므로 항상 제공해야합니다.

compareTo 로직은 데이터 집합을 정렬하고 또한 요소들이 그룹화 할 수 있도록 동일한 것을 만회 지시하는 방법을 분명히 알려줍니다.

ComparisionChainGuava의 멋진 유틸리티입니다.

equals 및 hashcode를 무시하는 것을 잊지 마세요! 파티셔너는 키의 해시 코드로 감속기를 결정합니다.

+0

이 사용 사례에서는 ComparisionChain이 정말 쉽습니다. 감사 –

1

두 필드를 비교할 수있는 Writable 및 WritableComparable을 구현하는 자체 클래스를 작성할 수 있습니다.

피에르 - 뤽 버트 랜드는