복붙노트

[HADOOP] Hadoop - 복합 키

HADOOP

Hadoop - 복합 키

다음과 같이 서식이 지정된 사용자 활동 데이터가 포함 된 탭으로 구분 된 파일이 있다고 가정합니다.

timestamp  user_id  page_id  action_id

각 페이지에서 사용자 작업을 계산하기 위해 hadoop 작업을 작성하므로 출력 파일은 다음과 같아야합니다.

user_id  page_id  number_of_actions

여기에 복합 키와 같은 것이 필요합니다.이 키는 user_id와 page_id를 포함합니다. hadoop으로 이것을 수행하는 일반적인 방법이 있습니까? 도움이되는 것을 찾지 못했습니다. 지금까지 매퍼 (mapper)에서 다음과 같은 키를 내보내고 있습니다.

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

그것은 작동하지만, 나는 그것이 최선의 해결책이 아니라고 느낍니다.

해결법

  1. ==============================

    1.자신 만의 Writable을 작성하십시오. 귀하의 예에서 솔루션은 다음과 같이 보일 수 있습니다.

    자신 만의 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();
      }
    
    }
    

    ID가 길어질 수도 있지만 여기에는 String 버전이 있습니다. Writable 인터페이스를 통한 기본적인 직렬화는 기본적으로 기본 생성자가 필요하므로 항상 제공해야합니다.

    compareTo 로직은 데이터 셋을 정렬하는 방법을 분명히 알려주고 또한 어떤 엘리먼트가 같은지를 감속기에 알려 그룹화 할 수 있도록 알려줍니다.

    ComparisionChain은 Guava의 유용한 유틸리티입니다.

    equals와 hashcode를 오버라이드하는 것을 잊지 마라! 파티셔너는 키의 해시 코드로 감속기를 결정합니다.

  2. ==============================

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

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

    피에르 - 뤼 베르트랑

  3. from https://stackoverflow.com/questions/12427090/hadoop-composite-key by cc-by-sa and MIT license