0

ここで私が混乱しているのは (私が思うに)、qfun への引数がどうあるべきか、そして戻り値がどうあるべきかということです。READMEは基本的にこれについて何も述べておらず、それが示す例では 2 番目と 3 番目の引数が破棄されています。

今のところ、私は議論を理解しようとしているだけで、Riak を実用的な目的には使用していません。最終的には、これを使用して (遅い、MySQL ベースの) 財務報告システムを再構築しようとしています。ここでの私の目標の無意味さを無視して、なぜ次のbadfun例外が私に与えられるのでしょうか?

データは名前と年齢のタプル (ペア) であり、キーは名前です。Erlang コンソールからデータを挿入する前に、JSON などへの変換は行っていません。

いくつかの{Name, Age}ペアが格納され<<"people">>ているので、MapReduce を使用して (「方法」を理解する以外の理由ではありません)、この最初の使用では変更されていない値を元に戻します。

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

ただし、これは私に悪い楽しみを与えます:

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

データを変更せずにマップ関数に渡すにはどうすればよいですか? README にあるものよりも優れた Erlang クライアントのドキュメントはありますか? その README は、入力が何であるかを既に知っていることを前提としているようです。

4

3 に答える 3

1

異なる目的を果たす 2 つの Riak Erlang クライアントがあります。

1 つ目は、riak_kv モジュール (riak_client.erl および riak_object.erl) に含まれる内部 Riak クライアントです。これは、Riak コンソールに接続している場合、または MapReduce 関数またはコミット フックを作成している場合に使用できます。Riak ノード内から実行されるため、qfun と非常にうまく連携します。

もう 1 つのクライアントは、 Erlangの公式Riak クライアントであり、外部アプリケーションによって使用され、プロトコル バッファ インターフェイスを介して Riak に接続します。これは、上記の例で使用しているものです。これはプロトコル バッファを介して接続するため、通常、Erlang の MapReduce 関数をコンパイルし、名前付き関数としてクラスタのノードにデプロイすることをお勧めします。これにより、他のクライアント ライブラリからもアクセスできるようになります。

于 2013-04-13T21:09:32.793 に答える
0

私のコードは実際には正しいと思いますが、私の問題は、シェルを使用してコードを実行しようとしているという事実にあります。Riak で実行する前に、実際にコードをコンパイルする必要があります。これは、Erlang シェルと funs をコンパイルする方法の制限です。

于 2013-04-11T14:09:15.873 に答える