2012-07-03 4 views
0

나는 사용자 정의 쓰기 유형을 정의하고 있는데 현재이 같은 뭔가가 :맞춤 쓰기 가능 유형에 변수를 입력하는 가장 좋은 방법은 무엇입니까?

public static class MyType implements Writable { 
    private int value1; 
    private String value2; 

    // ... override code etc 
} 

내가 사용하는 int하고 문자열 또는 이러한 intWritable 및 텍스트의 사용을해야 하는가를? 필자가 보았던 예제는 필자가 사용했던 방법을 사용하는 경향이 있지만 Writable 유형을 사용하면 더 효율적으로 사용할 수있는 것처럼 보입니다.

답변

1

int, string 등을 사용할 수 있습니다. 완벽하게 좋습니다. Writable을 구현할 때 readFields(DataInput in)write(DataOutput out) 메서드를 재정의해야합니다. 당신은 같은 순서로 varibles를 작성해야합니다. 그것이 직렬화가 일어나는 곳입니다. 그리고 당신은 쓰기 가능한 유형의 변수를 만들기 위해 고통을 감수 할 필요가 없습니다.

1

읽기 및 쓰기를 재정 의하여 직렬화를 수행하므로 완벽하게 좋습니다. readInt() 또는 writeInt() 등을 사용하여 ints과 같은 프리미티브를 다른 프리미티브 또는 문자열과 함께 작성할 수 있습니다.

TextLongWritables은 주로 사용할 수있는 몇 가지 기본 제공 유형을 갖기 위해 사용됩니다. 프리미티브를 사용하여 완벽하게 정의 된 객체를 작성해야하는 경우 Text 또는 LongWritable은 일종의 직렬 가능 래퍼가 아닙니다.

-1

필자는 Text와 같은 Writable을 작성하는 경향이 있습니다. 왜냐하면 이러한 클래스에서 수행 된 I/O에 대한 강력한 최적화가 있기 때문입니다. 그러나 최선의 방법은 두 가지 방법으로 시도하고 어떤 것이 더 나은지 확인하는 것입니다.

+0

사실'LongWritable'은'out.writeLong()'을 수행하고'Text'는 문자열을 구성하는 바이트 배열을 씁니다. 따라서 클래스 내에서 수행되는 추가 최적화는 없습니다. 프리미티브 대신에 객체 할당 오버 헤드를 사용하면됩니다. –

+0

좋아, 그럼 사용자 정의 WritableComparable은 < T >입니다. 확실히 RawComparable을 텍스트로 다시 구현하는 문제를 겪고 싶어하는 사람은 아무도 없습니다. 그것을 사용하는 것이 낫다. –

+0

'WritableComparable'을 사용한다면 compareTo 함수로 간단하게 문자열을 비교할 수 있습니다. 자신 만의'RawComparator'를 구현할 필요가 있다면, 기존 구현을 우회하거나 직접 작성할 수 있습니다. 텍스트는 바이트 배열 만 비교합니다. 구현할 특별한 것은 없습니다. –

관련 문제