在Hadoop中使用NullWritable的优点

Ven*_*k K 27 java hadoop mapreduce

什么是使用的优点,NullWritablenull使用过的键/值null文本(即new Text(null)).我从"Hadoop:The Definitive Guide"一书中看到以下内容.

NullWritable是一种特殊类型Writable,因为它具有零长度序列化.没有字节写入或读取流.它用作占位符; 例如,在MapReduce中,NullWritable当您不需要使用该位置时,可以将键或值声明为- 它有效地存储常量空值.SequenceFile当您想要存储值列表而不是键值对时,NullWritable也可以用作键.它是一个不可变的单例:可以通过调用来检索实例 NullWritable.get()

我不清楚如何使用输出写出输出NullWritable?在开始输出文件中是否有一个常量值表示该文件的键或值是null,因此MapReduce框架可以忽略读取null键/值(以哪个为准null)?另外,null文本是如何序列化的?

谢谢,

Venkat

Joe*_*e K 23

键/值类型必须在运行时给出,因此任何写入或读取NullWritables都将提前知道它将处理该类型; 文件中没有标记或任何内容.从技术上来说,这NullWritables是"阅读",只是"阅读"a NullWritable实际上是一种无操作.你可以亲眼看到没有任何书面或阅读:

NullWritable nw = NullWritable.get();
ByteArrayOutputStream out = new ByteArrayOutputStream();
nw.write(new DataOutputStream(out));
System.out.println(Arrays.toString(out.toByteArray())); // prints "[]"

ByteArrayInputStream in = new ByteArrayInputStream(new byte[0]);
nw.readFields(new DataInputStream(in)); // works just fine
Run Code Online (Sandbox Code Playgroud)

至于你的问题new Text(null),你可以尝试一下:

Text text = new Text((String)null);
ByteArrayOutputStream out = new ByteArrayOutputStream();
text.write(new DataOutputStream(out)); // throws NullPointerException
System.out.println(Arrays.toString(out.toByteArray()));
Run Code Online (Sandbox Code Playgroud)

Text什么都行不通null String.

  • 你是对的.如果所有值都需要转到单个reducer,标准做法是使用NullWritable,因为它不会占用任何空间.实际上,这可能是NullWritable最常见的用法. (3认同)
  • `context.write(null,value)`实际上适用于某些输出格式(例如TextOutputFormat只输出没有键和配置分隔符的值) (2认同)