4

Hadoop 0.20.2 を使用しています。Xを実装するオブジェクトを書いていますWritable

XのインスタンスであるいくつかのフィールドがありますInteger。これらのフィールドでは、null値に特別な意味があります。

オブジェクトをシリアル化するときに、インターフェイスDataOutput outwriteメソッドに書き込むことによって、書き込む方法はありますか? または、値がnullであることを示す別のブール値を使用する必要がありますか?Writablenull

4

3 に答える 3

6

ブール値は、オブジェクトプロパティに。としてフラグを立てるための標準的な手順です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);
    }
  }

それもかなり読みやすいです。ただし、次のJavaDocsに記載されているように、レコードごとに1バイトの一定のオーバーヘッドがあることに注意してください#writeBoolean

この出力ストリームにブール値を書き込みます。引数vが真の場合、値(byte)1が書き込まれます。vがfalseの場合、値(byte)0が書き込まれます

于 2013-03-14T18:33:36.537 に答える
1

NullWritable は、シリアル化の長さがゼロであるため、特別なタイプの Writable です。ストリームにバイトが書き込まれたり、ストリームから読み取られたりすることはありません。詳細については、hadoop 決定版ガイド pg:104 を参照してください。

于 2013-03-14T18:07:01.530 に答える
0

Java オブジェクトのシリアライゼーション プロトコルでは、シリアライズ時のnullオブジェクトのサイズは正確に 1 バイトです。したがって、カスタムの方法に問題はないと思います。writeWritable

原則として、何をモデル化しようとしているかによって異なります。a を表現しようとしていてBooleannullがここにないことを意味する場合は、デフォルトで false に設定する必要があります。整数の場合は、データセットのデフォルト値が何であれデフォルトにする必要があります。したがって、言及している「特別な意味」に関連する特定の処理がない限り、 nullを書いても問題ないと思います。それ以外の場合は、デフォルト値を使用する必要があります。

于 2013-03-14T18:26:14.103 に答える