2012-07-18 102 views
1

我在RIAK上存儲Person POJO(4個字符串字段 - id,name,lastUpdate,Data),然後嘗試使用MapReduce獲取這些對象。在RIAK上獲取MapReduce結果(使用Java客戶端)

我這樣做非常相似,芭蕉文檔:

BucketMapReduce m = riakClient.mapReduce("person"); 
    m.addMapPhase(new NamedJSFunction("Riak.mapByFields"), true); 
    MapReduceResult result = m.execute(); 
    Collection<Person> tmp = result.getResult(Person.class); 

人的字符串構造函數被調用:

public Person(String str){} 

(我必須有這樣的構造,否則我得到一個異常,因爲這是缺少) 在那裏,我得到的對象作爲一個字符串 - 對象的字段在一個字符串與奇怪的分隔符。

爲什麼我沒有將對象自動轉換爲我的POJO?我真的需要檢查字符串並反序列化它嗎?我做錯了什麼?s

回答

3

你正在使用的JS函數沒有做你認爲它的工作:)它根據一個字段選擇一個具有特定值的對象,你必須提供一個參數給階段。

我認爲你要找的是mapValuesJson這將做你似乎想要做的事情。

此外,您在POJO中完全不需要構造函數。

下面的代碼應該指向你在正確的方向(顯然這是超級簡單,在POJO中所有的公共領域,沒有註釋):

public class App { 

    public static void main(String[] args) throws IOException, RiakException 
    { 
     IRiakClient client = RiakFactory.httpClient(); 
     Bucket b = client.fetchBucket("test_mr").execute(); 

     b.store("myobject", new Person()).execute(); 
     IRiakObject o = b.fetch("myobject").execute(); 
     System.out.println(o.getValueAsString()); 


     BucketMapReduce m = client.mapReduce("test_mr"); 
     m.addMapPhase(new NamedJSFunction("Riak.mapValuesJson"), true); 
     MapReduceResult result = m.execute(); 
     System.out.println(result.getResultRaw()); 
     Collection<Person> tmp = result.getResult(Person.class); 

     for (Person p : tmp) 
     { 
      System.out.println(p.data); 
     } 


     client.shutdown(); 
    } 
} 

class Person 
{ 
    public String id = "12345"; 
    public String name = "my name"; 
    public String lastUpdate = "some time"; 
    public String data = "some data"; 


} 
+0

喜布賴恩,感謝您的答覆。其實我已經嘗試了你提到的JS函數,但是我甚至沒有通過執行階段。我得到一個IOException:{「phase」:0,「error」:「[{>,477},{<<\"message\">>,<< \」JSON.parse \「>>},{<<\"source\">>,<<\"unknown\">> }]「,」input「:」{ok,{r_object,<<\"new\">>,<<\"2\">>,[{r_content,{dict,7 ....或許你提到的註釋是我缺少的東西? – 2012-07-29 15:28:25

+0

聽起來像你存儲在riak中是無效的JSON;例如'JSON.parse'錯誤(或者至少至少有一個你存儲的項目是無效的)上面的代碼是一個完全有效的例子 - 註釋不是如果你想在讀寫對象時指定索引,鏈接等,可以使用它們 – 2012-07-29 17:52:36

+0

嘿,Brian,非常感謝!我正在運行你的例子,並得到了我的原始異常:org.codehaus.jackson.map。 JsonMappingException:找不到適合類型的構造函數[simple type,com.att.cso.omss.data.riak.contr ollers.RiakBaseController $ Personx]:無法從JSON對象實例化(需要添加/啓用類型信息?) 然後我用你的代碼創建了一個新的乾淨的項目 - 它的工作!顯然,我的POM中的一些較舊的依賴關係指向了其他的JSON版本,它正在壓倒RIAK的一個需求。謝謝! – 2012-07-30 08:03:29