小编典典

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

java

我在RIAK上存储Person POJO(4个字符串字段-id,name,lastUpdate,Data),然后尝试使用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?我真的需要遍历字符串并反序列化吗?我做错什么了吗?


阅读 221

收藏
2020-11-30

共1个答案

小编典典

您正在使用的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";


}
2020-11-30