【问题标题】:riak mapreduce with limit on response size in javariak mapreduce,限制java中的响应大小
【发布时间】:2014-05-01 04:30:31
【问题描述】:

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

我已经让二级索引查询工作了。排序似乎没有做任何事情。排序没有错误,只返回未排序的结果。返回记录数的限制会导致服务器返回“bad_json”错误。

这就是我所拥有的。假设查询“john_doe”拥有的最新汽车的“cars”存储桶。 (一些名称已更改以保护无辜者;):

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-18T17: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();

【问题讨论】:

    标签: java mapreduce riak


    【解决方案1】:

    对于排序,有一个 mailing list post 涵盖了这个主题。我看到该实现与您的实现之间的主要区别是在映射阶段使用 JavaScript Riak.mapValuesJson 函数。

    为了限制,如果您只想要排序列表中的第一项,请尝试让您的排序函数仅返回第一个元素。虽然随着部分结果集从各个 vnode 到达,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];" + 
            "}"
        "}"
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      相关资源
      最近更新 更多