2013-04-24 26 views
27

null anahtarları/değerleri için null metinlerini (yani new Text(null)) kullanarak NullWritable kullanmanın avantajları nelerdir? «Hadoop: Kesin Kılavuz» kitabından aşağıdakileri görüyorum. bu, sıfır uzunlukta bir seri olduğu gibiHadoop'ta NullWritable kullanmanın avantajları

NullWritable, Writable özel bir türüdür. Akışın baytına yazılmadığı veya akıştan okunamadığı. Bir yer tutucu olarak kullanılır; Örneğin, MapReduce içinde bir anahtar veya değer NullWritable olarak bildirilebilir ve bu konumu kullanmak için 'a ihtiyaç duymazsınız; bu, sabit bir boş değeri etkin bir şekilde depolar. NullWritable, numaralı anahtarın, anahtar değer çiftlerine karşı bir değer listesini saklamak istediğinizde SequenceFile anahtarında da yararlı olabilir. Bu değişmez bir tekil geçerli: örneği NullWritable.get()

açıkça çıkış NullWritable kullanılarak yazılır anlamıyorum arayarak geri alınabilir mi? Bu dosyanın anahtarlarının veya değerlerinin null olduğunu belirten başlangıç ​​çıktı dosyasında tek bir sabit değer olacak, böylece MapReduce çerçevesi null anahtarlarını/değerlerini (hangisi null ise) okumayı yoksayabilir mi? Ayrıca, null metinleri nasıl serileştirilir?

sayesinde

Venkat

cevap

22

anahtar/değer türleri zamanında verilen, yani her şey yazarken veya ileride bu tip ile ilgili olacak o zamanın bilecek NullWritables okuma olmalıdır; dosyada herhangi bir işaretleyici veya herhangi bir şey yoktur. Ve teknik olarak NullWritables "okunur", sadece bir NullWritable "okuma" aslında bir no-op. Sen hiç yazılı veya okumak birşey olmadığını kendiniz görebilirsiniz:

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 

Ve Sorunuza olarak yaklaşık new Text(null), yine, bunu deneyebilirsiniz:

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 hiç çalışmaz nullString ile birlikte.

+0

Teşekkür Mehmet sizi zaman ve cevap. Şimdi, NullWritable'ın nasıl çalıştığını anlıyorum. Boş metinle ilgili olarak, üzgünüm, Metin olarak anahtarların/değerlerin olması ve sonra context.write (boş değer) yapılması (anahtarın metnin olduğunu varsayalım) hakkında konuşmak istedim. –

+0

Bu da bir NullPointerException atmalıdır. boş anahtarlar ve değerler çalışmıyor. Boş bir anahtar veya değere gerçekten ihtiyacınız varsa, bunun için boş bir dize veya -1 gibi başka bir gösterim düşünmelisiniz. –

+2

'bağlamı.write (null, value) 'aslında bazı çıktı biçimleri için çalışacaktır (örneğin TextOutputFormat, sadece anahtar ve yapılandırılmış sınırlayıcı olmadan değeri çıkarır) –

0

Çalışma yöntemini değiştiririm. ve Hep kendi Yazılabilir sınıfta dize sarın ve bir boolean olabilir

@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; 
} 
0

başarısı boş dizeleri ya da değil sahip belirten:

@Override 
public void readFields(DataInput in) throws IOException { 
    ... 
    boolean hasWord = in.readBoolean(); 
    if(hasWord) { 
     word = in.readUTF(); 
    } 
    ... 
} 

ve için

@Override 
public void write(DataOutput out) throws IOException { 
    ... 
    boolean hasWord = StringUtils.isNotBlank(word); 
    out.writeBoolean(hasWord); 
    if(hasWord) { 
     out.writeUTF(word); 
    } 
    ... 
} 
İlgili konular