2013-03-14 1 views
4

나는 하둡 0.20.2를 사용하고있다. 나는 X 객체를 작성 중이며 Writable을 구현하고 있습니다.하둡의 DataOutput에 null을 쓰는 것

X에는 Integer의 인스턴스 인 여러 필드가 있습니다. 이 필드의 경우 null 값은 특별한 의미가 있습니다.

Writable 인터페이스의 write 방법 DataOutput out에 작성하여, 객체 직렬화, 내가 null을 쓸 수있는 방법은 무엇입니까? 또는 값이 null임을 나타내는 별도의 부울을 사용해야합니까?

+0

* null * 그대로 쓰려고 노력 했는가? 재정의 한 * write * 메서드를 공유 할 수 있습니까? – Amar

+0

null 값을 사용하여 X를 구성하고 직렬화하고 역 직렬화 한 다음, 값이 예상 한 값인지 확인하는 테스트를 작성하십시오. 그게 작동한다면 그것은 hadoop 하에서 작동해야합니다. –

답변

6

부울은 객체 propertys를 NULL으로 표시하는 표준 절차입니다.

public class LongMessage implements Writable { 

    private long tag; 
    private String data; 
    // interface methods omitted first 
} 

그래서 data은 어떤 이유로 null 될 수 있습니다

이 경우를 생각해 보자. 따라서 다음과 같이 읽기/쓰기를 구현합니다.

@Override 
    public void readFields(DataInput in) throws IOException { 
    tag = in.readLong(); 
    if (in.readBoolean()) { 
     data = in.readUTF(); 
    } else { 
     data = null; 
    } 
    } 

    @Override 
    public void write(DataOutput out) throws IOException { 
    out.writeLong(tag); 
    if (data != null) { 
     out.writeBoolean(true); 
     out.writeUTF(data); 
    } else { 
     out.writeBoolean(false); 
    } 
    } 

매우 읽기 쉽습니다.

이 출력 스트림에 부울 값을 씁니다 :하지만 #writeBoolean의 JavaDoc을에 명시된대로 레코드 당 1 바이트 정수 오버 헤드가 있습니다. 인수 v가 이면 true (1) 값이 기록됩니다. v가 false 인 경우, 값 (byte) 0 가 기입된다.

+0

잘 모르겠지만 Hadoop이 Writable 인스턴스를 다시 사용한다는 것은 기억해야합니다. 즉, DataInput에서 부울 false를 읽는 경우 데이터를 기본값으로 다시 설정해야한다는 것을 의미합니다. 그렇지 않으면 다른 실행의 값으로 끝날 수 있습니다. – whiskeysierra

+1

@whiskeysierra. 데이터를 null로 설정하는 else 문을 추가했습니다. –

1

NullWritable은 길이가 0 인 직렬화가 있으므로 특수 유형의 Writable입니다. 바이트는 스트림에 쓰거나 읽지 않습니다. 하둡 명확한 가이드 페이지에서 상기 기준 룩 는 : 104

0

직렬화하는 객체의 크기가 Java object serialization protocol 정확히 1 바이트이다. 따라서 Writablewrite 방법에 문제가 있다고 생각하지 않습니다.

일반적으로 모델링하려는 대상에 따라 다릅니다. Boolean을 나타내는 경우 null은 여기에 없다는 것을 의미하므로 기본값은 false 여야합니다. 정수 인 경우 데이터 세트의 기본값이 무엇이든 기본값으로 설정해야합니다. 따라서 언급하고있는 "특별한 의미"와 관련된 특정 처리가 없으면 null을 쓰는 것이 좋습니다. 그렇지 않으면 기본값을 사용해야합니다.