NullWritable
キー/値に対してnull
を使用することの利点は、null
テキスト(つまりnew Text(null)
)を使用するよりも優れています。 『Hadoop:The Definitive Guide』の本から次のことがわかります。
NullWritable
は、長さがゼロのシリアル化であるため、Writable
の特殊なタイプです。ストリームにバイトが書き込まれたり、ストリームから読み取られたりすることはありません。プレースホルダーとして使用されます。たとえば、MapReduceでは、その位置を使用する必要がない場合、キーまたは値をNullWritable
として宣言できます。空の定数値を効果的に格納します。 NullWritableは、キーと値のペアではなく、値のリストを格納するときにSequenceFile
のキーとしても役立ちます。これは不変のシングルトンです。インスタンスはNullWritable.get()
を呼び出すことで取得できます
NullWritable
を使用して出力がどのように書き出されるのか明確に理解していませんか?最初の出力ファイルには、このファイルのキーまたは値がnull
であることを示す単一の定数値があるため、MapReduceフレームワークはnull
のキー/値(どちらでも)の読み取りを無視できます。 null
)?また、null
テキストはどのように実際にシリアル化されますか?
おかげで、
ベンカット
キー/値タイプは実行時に指定する必要があるため、NullWritables
の書き込みまたは読み取りは、そのタイプを処理することを事前に認識します。ファイルにはマーカーも何もありません。そして、技術的にはNullWritables
は「読み取り」です。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
_
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()));
_
Text
は、null
String
では機能しません。
文字列を独自のWritableクラスにラップして、空の文字列があるかどうかを示すブール値を常に持つことができます。
@Override
public void readFields(DataInput in) throws IOException {
...
boolean hasWord = in.readBoolean();
if( hasWord ) {
Word = in.readUTF();
}
...
}
そして
@Override
public void write(DataOutput out) throws IOException {
...
boolean hasWord = StringUtils.isNotBlank(Word);
out.writeBoolean(hasWord);
if(hasWord) {
out.writeUTF(Word);
}
...
}
Runメソッドを変更します。そして成功
@Override
public int run(String[] strings) throws Exception {
Configuration config = HBaseConfiguration.create();
//set job name
Job job = new Job(config, "Import from file ");
job.setJarByClass(LogRun.class);
//set map class
job.setMapperClass(LogMapper.class);
//set output format and output table name
//job.setOutputFormatClass(TableOutputFormat.class);
//job.getConfiguration().set(TableOutputFormat.OUTPUT_TABLE, "crm_data");
//job.setOutputKeyClass(ImmutableBytesWritable.class);
//job.setOutputValueClass(Put.class);
TableMapReduceUtil.initTableReducerJob("crm_data", null, job);
job.setNumReduceTasks(0);
TableMapReduceUtil.addDependencyJars(job);
FileInputFormat.addInputPath(job, new Path(strings[0]));
int ret = job.waitForCompletion(true) ? 0 : 1;
return ret;
}