riak教程 - 关于Riak+Erlang的riakc客户端中的MapReduce完全困惑




riak介绍 (2)

我在这里困惑的主要原因是qfun的理由应该是什么,回报值应该是什么。 自述文件基本上没有提到这个,它给出的例子抛出了第二和第三个参数。

现在我只是试图理解这些论点而不是使用Riak来做任何实际的事情。 最终,我将试图用它来重建我们的(基于MySQL的)缓慢的财务报告系统。 所以忽略了我这个目标的无意义,为什么下面给我一个badfun例外?

数据只是名称和年龄的元组(对),键是名字。 在从Erlang控制台插入数据之前,我没有对JSON进行任何转换。

现在,在一些存储在<<"people">> {Name, Age}对中,我想使用MapReduce(除了了解“如何”)来取回值,在第一次使用时不变。

riakc_pb_socket:mapred(
    Pid, <<"people">>,
    [{map, {qfun, fun(Obj, _, _) -> [Obj] end}, none, true}]).

这只是给了我一个badfun,但是:

{error,<<"{\"phase\":0,\"error\":\"{badfun,#Fun<erl_eval.18.17052888>}\",\"input\":\"{ok,{r_object,<<\\\"people\\\">>,<<\\\"elaine\\\">"...>>}

如何通过我的map函数传递数据不变? Erlang客户端的文档是否比自述文件中有更好的文档? 该自述文件似乎假定您已经知道输入是什么。

https://code.i-harness.com


我认为我的代码实际上是正确的,我的问题在于我试图使用shell来执行代码。 我需要在可以在Riak中运行之前实际编译代码。 这是Erlang shell的一个限制,也是编译funs的方式。


有2个Riak Erlang客户端服务于不同的目的。

第一个是riak_kv模块中包含的内部Riak客户端(riak_client.erl和riak_object.erl)。 如果您连接到Riak控制台,或者您正在编写MapReduce函数或提交挂钩,则可以使用此选项。 因为它是从一个Riak节点运行的,所以在qfuns中运行的很好。

另一个客户端是Erlang的官方Riak客户端,由外部应用程序使用,并通过协议缓冲区接口连接到Riak。 这是你在上面的例子中使用的。 由于这通过协议缓冲区进行连接,通常建议将Erlang中的MapReduce功能作为命名函数编译并部署在群集节点上 。 这也将使他们可以从其他客户端库访问。