2014-07-18 25 views
20

Bir eşleme çeken ve onu bir nesneye dönüştüren bir eşleştiriciye sahip bir Harita Azaltma işim var; Jackson kullanarak JSON'a marshalled. Değer, kayıttaki diğer bir Metin alanıdır. eşleştirici çıktıları JSON nesnesi unmarshalls ve anahtar değer çiftlerini birleştiren bir Birleştirici gönderilirStrange Jackson Yasadışı karakter ((CTRL-CHAR, kod 0)) Özel Durum Haritada Birleştirin Azaltın Birleştirici

ObjectMapper mapper = new ObjectMapper(); 
MyObject val = new MyObject(); 
val.setA(stringA); 
val.setB(stringB); 
Writer strWriter = new StringWriter(); 
mapper.writeValue(strWriter, val); 
key.set(strWriter.toString()); 

:

eşleyiciye göre ilgili parçası aşağıdaki gibi bir şeydir./Set yöntem ve bir varsayılan kurucu olsun,

public void reduce(Text key, Iterable<IntWritable> values, Context cxt) 
    throws IOException, InterruptedException { 
    int count = 0; 
    TermIndex x = _mapper.readValue(key.toString(), MyObject.class); 
    for (IntWritable int : values) ++count; 
    ... 
    emit (key, value) 
} 

MyObject sınıfı iki alan (her iki dizeleri) oluşur: Bu gibi bir şey kavramsal çok basit ve olduğunu. Alanlardan biri, bir web taramayı temel alan metin parçacıklarını depolar, ancak her zaman bir dizedir. o (harita oluşturucusu taramasından gelen kayıtları oluşturuyor çünkü) ve ben kolayca erişim aşağıdaki istisnası atılır olabilir belirli kayıtları, ulaşıncaya kadar

public class MyObject { 
    private String A; 
    private String B; 

    public MyObject() {} 

    public String getA() { 
    return A; 
    } 
    public void setA(String A) { 
    this.A = A; 
    } 
    public String getB() { 
    return B; 
    } 
    public void setIdx(String B) { 
    this.B = B; 
    } 
} 

Benim MapReduce işi ince çalışıyor görünüyor:

Error: com.fasterxml.jackson.core.JsonParseException: 

    Illegal character ((CTRL-CHAR, code 0)): only regular white space (\r, \n, \t) is allowed between tokens 
    at [Source: [email protected]; line: 1, column: 3] 

Bunun nedeni hakkında herhangi bir öneriniz var mı?

+0

kullanın 1.5.1 okhttp. Umarım sorununuzu çözecektir. – SkyWalker

+1

Kolay erişime sahip olmadığınızı söylediğinizi farkettim, ancak ön uçları taramayı ve akıştan 0 (NULL) gibi sahte kontrol karakterlerini kaldırmayı ve ardından jackson'a aktarmanızı öneriyorum. Çeşitli menkul kıymetler için finansal beslemelerin her zaman itlaf edilmesi gereken bu gibi sahte veriler olduğunu gördüm. Büyük olasılıkla gönderen taraftaki bir kusurdur. – sagneta

+0

Düşük düzeyde bir şey boş bayt (bayt 0) akışına enjekte edilir ve ayrıştırıcı bunları kabul etmez (JSON için geçersizdir). Bunun nasıl ve niçin gerçekleştiğini anlamanız gerekir; eşzamanlılık sorunları veya zamanlama (içeriği arabelleğe yüklenmeden önce ayrıştırmaya çalışmak) gibi birçok şey olabilir. – StaxMan

cevap

İlgili konular