在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";
}
喜布赖恩,感谢您的答复。其实我已经尝试了你提到的JS函数,但是我甚至没有通过执行阶段。我得到一个IOException:{“phase”:0,“error”:“[{>,477},{>,>},{>,> }]“,”input“:”{ok,{r_object,>,>,[{r_content,{dict,7 ....或许你提到的注释是我缺少的东西? – 2012-07-29 15:28:25
听起来像你存储在riak中是无效的JSON;例如'JSON.parse'错误(或者至少至少有一个你存储的项目是无效的)上面的代码是一个完全有效的例子 - 注释不是如果你想在读写对象时指定索引,链接等,可以使用它们 – 2012-07-29 17:52:36
嘿,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