Riak mapreduce在java中有响应大小限制



我试图在Riak 1.4上运行一个mapReduce查询,该查询由二级索引查询,按日期排序记录,然后将结果限制为第一个记录。

我已经得到了二级索引查询工作。这种类型似乎没有任何作用。排序没有错误,只是返回未排序的结果。对返回记录数量的限制将导致服务器返回一个'bad_json'错误。

这是我有的。假设它要查询"cars"桶,查找"john_doe"最近拥有的汽车。(为了保护无辜,有些名字已经改了;):

JSSourceFunction dateSortFunction = new JSSourceFunction(
    "function(v) {" +
        "return v.sort(function(a, b) {" +
            "return a.issueDate - b.issueDate ;" +
        "}" +
    ");" +
"}");
IndexQuery iq = new BinValueQuery(BinIndex.named("person"), "cars", "john_doe");
MapReduceResult response = session.mapReduce(iq)
   .addMapPhase(NamedErlangFunction.MAP_OBJECT_VALUE)
   .addReducePhase(dateSortFunction)
   .addReducePhase(new NamedJSFunction("Riak.reduceLimit"), 1)
   .execute();

我已经看到了一些关于排序的帖子,我希望最终能弄清楚。但是,我还没有看到任何关于LIMIT函数如何工作的帮助。

提前感谢!

更新:多亏了乔,他让我走上了正轨。这就是我最终的成功之处。我的日期格式是ISO 8601(例如。2011 - 05 - 18 - t17:00:00 07:00)。因此,我可以通过词法比较找出正确的排序。此外,我发现了javascript的数组缩短方法,并更新了代码,以返回到前5个对象。

JSSourceFunction sortLimitFunction = new JSSourceFunction(
    "function(v) {" +
        "v.sort(function(a, b) {" +
            "return a.issueDate < b.issueDate" +
        "}" +
    ");" +
    "if (v.length > " + "5" + ") { " +
        "v.length = " + "5" + ";" +
    "}" +
    "return v;" +
"}");
IndexQuery iq = new BinValueQuery(BinIndex.named("person"), "cars", "john_doe");
MapReduceResult response = session.mapReduce(iq)
    .addMapPhase(new NamedJSFunction("Riak.mapValuesJson"))
    .addReducePhase(sortLimitFunction)
    .execute();

对于排序,有一个邮件列表帖子涵盖了这个主题。我认为该实现与您的实现之间的主要区别在于使用了JavaScript Riak。mapValuesJson函数

对于限制,如果您只想要排序列表中的第一个元素,请尝试让排序函数只返回第一个元素。当部分结果集从各个vnodes到达时,reduce函数可以(很可能是)被调用多次,但是合并列表中的第一个元素也必须是部分列表中它起源的第一个元素,所以这应该会给您所寻找的结果:

JSSourceFunction dateSortFunction = new JSSourceFunction(
    "function(v) {" +
        "var arr = v.sort(function(a, b) {" +
            "return a.issueDate - b.issueDate ;" +
            "}" +
        ");" +
        "if (arr.length == 0) { " +
           "return [];" +
        "} else {"
           "return arr[0];" + 
        "}"
    "}"
);

最新更新