在RIAK上获取MapReduce结果(使用Java客户端)

在RIAK上获取MapReduce结果(使用Java客户端)

问题描述:

我在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

你正在使用的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},{>,>},{>,> }]“,”input“:”{ok,{r_object,>,>,[{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