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



我将Person POJO(4个字符串字段-id、name、lastUpdate、Data)存储在RIAK上,然后尝试使用MapReduce获取这些对象。

我所做的与Basho文档非常相似:

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

调用Person的String构造函数:

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";

}

相关内容

  • 没有找到相关文章

最新更新