3

私のアプリケーションでは、キーとして年を使用する必要があります。通常、特定のメジャーを年ごとにグループ化し、IntWritableは合計または平均する値に使用されるため、テキストの方がキーに適していると思います。しかし、年の型としてIntWritableを使用できると思います。年をintとして表すことができるので、それを妨げるものは何もありません。キーとして1年間どちらが適切かを理解したいのですが、それはテキストですか、それともIntWritableですか?

4

2 に答える 2

2

どちらも適していますが、効率に関しては重要な違いがあります。

まず、「より少ない」数のレコードがある場合、これから説明することはおそらく取るに足らないものであり、心配する価値はありません. ただし、TB のデータを処理する場合、保存されるサイクルは数分にもなる可能性があります。

Amar が彼の回答で指摘しているように、 Text は年の値を一連の UTF-8 エンコード文字としてシリアル化します。実際には、バイト数の VInt を出力し、次にバイト自体を出力します。通常、年の長さは 4 文字であるため、年は 5 バイトのデータ (長さ 1 バイト、内容 4 バイト) にシリアル化されます。

IntWritable は常に 4 バイトとしてシリアル化されますが、このバイト空間で +/- 20 億の範囲の数値を保持できます。1 年間のニーズには明らかに過剰です (短い 2 バイトは +/- 32k を保持し、1 バイトは +/- を保持します) 128)

そのため、テキストを使用すると、データをシリアル化する際に (IntWritable と比較して) 1 バイト効率が低下します。

考慮すべきもう 1 つのことは、生のコンパレータが各タイプでどのように機能するかです。

Text.Comparator は、長さを示す vint バイトをスキップしてから、バイトごとに文字の比較を開始します。そのため、2000 年と 2001 年を比較するには、5 番目のバイトに到達する必要があります (1 バイト長 + 差は4番目の文字)。しかし、違いが最初の文字 (たとえば 1999 年と 2000 年の間) にある場合、生のコンパレータは 2 番目のバイトの後に答えを持っています。

IntWritable.Comparator は各キーの 4 バイトを読み取り、次に int 比較を行うため、数値 123456789 と 1 を比較する場合でも、比較を行う前に各キーから 4 バイトすべてを処理する必要があります。

要約すると、Text はシリアル化するのにコストがかかりますが、比較するのは安価です。

データ ドメインに応じて別のオプションがあります。たとえば、1970 年からの年のみを表す必要がある場合は、ByteWritable を使用して 1970 年以降の年を表すことができます (1970 年から 2097 年を表すことができます)。シリアル化するのに 1 バイト、比較するときに 1 バイトしかかかりません。

より広い範囲を表す必要がある場合は、VIntWritable よりも効率的な VIntWritable を使用することもできます (おそらく、1970 ~ 9999 の範囲の年を格納するのに 2 バイトしか必要としません)。

于 2013-02-21T01:06:41.637 に答える
1

私はIntWritableあなたのために仕事をするならあなたはそれで行くべきだと信じています。IntWritableより軽量ですText

これが意味するのは、これらの両方のクラスの実装を見ると、IntWritable1つのプロパティしかないことがわかるかもしれないということです。

private int value;

の実装中に、Text2つのプロパティが事前にあることがわかります。

private int length;
private byte[] bytes;

さらに、Textクラスは標準のUTF8エンコーディングを使用してテキストを格納します。これは、バイトレベルでテキストをシリアル化、逆シリアル化、および比較するためのメソッドを提供します。長さのタイプは整数であり、ゼロ圧縮形式を使用してシリアル化されます。さらに、バイト配列を文字列に変換せずに文字列を走査するためのメソッドを提供します。文字列のシリアル化/逆シリアル化、文字列のコーディング/デコード、バイト配列に有効なUTF8コードが含まれているかどうかの確認、エンコードされた文字列の長さの計算のためのユーティリティも含まれています。

したがって、これらすべてが必要ない場合は、なぜTextクラスを使用するのですか?と一緒に行きIntWritableます。

于 2013-02-20T18:26:42.820 に答える