5

私は現在、Erlang を使用して Cassandra/thrift に頭を悩ませようとしています...

「mq」という名前の列ファミリーがあります(メッセージキューのように)...

ユーザーごとに(user_idを使用して)行を作成したいと思います。各メッセージは、名前のタイムスタンプと値としてのメッセージを持つ新しい列になります。

これがCassandra-cliで私がやっていることです:

create keyspace my_keyspace;
use my_keyspace;
create column family mq with comparator=UTF8Type and key_validation_class=UTF8Type;

%% Adding to user_id (00000001) the message "Hello World!" 
set mq['00000001']['1336499385041308'] = 'Hello Wold';

すべてがCassandra-cliでうまく機能します

ただし、Erlang から挿入しようとすると、いくつかの問題が発生します。

1>rr(cassandra_types).
2>{ok, C}=thrift_client_util:new("localhost", 9160, cassandra_thrift,[{framed, true}]).
3>thrift_client:call(C, 'set_keyspace', ["peeem"]).
4>thrift_client:call(C,'insert',["00000001",
                     #columnPath{column_family="mq"},
                     #column{name="1336499385041308", value="Hello World!"},
                     1
                     ]
                   ).

エラーは次のとおりです。

{error,{bad_args,insert,
              ["00000001",
               #columnPath{column_family = "mq",super_column = undefined,
                           column = undefined},
               #column{name = "1336499385041308",value = "Hello World!",
                       timestamp = undefined,ttl = undefined},1]}}}

どんな助けでも大歓迎です...

編集1:

私はそれがあるべきであることを発見しました(他の誰かのために働くので):

thrift_client:call(C,'insert', ["00000001", #columnParent{column_family="mq"}, #column{name="123456",value="Hello World!"}, 2]).

関連するエラー メッセージは次のとおりです。

** exception error: no match of right hand side value {{protocol,thrift_binary_protocol,
                                                                 {binary_protocol,{transport,thrift_framed_transport,
                                                                                             {framed_transport,{transport,thrift_socket_transport,
                                                                                                                          {data,#Port<0.730>,infinity}},
                                                                                                               [],[]}},
                                                                                  true,true}},
                                                       {error,closed}}
     in function  thrift_client:send_function_call/3 (src/thrift_client.erl, line 83)
     in call from thrift_client:call/3 (src/thrift_client.erl, line 40)
4

2 に答える 2

1

わかりました、何が問題だったのか、または正しい問題が見つかりました...

接続して挿入するための私のコードは次のとおりです...

rr(cassandra_types).
{ok, C}=thrift_client_util:new("localhost", 9160, cassandra_thrift,[{framed, true}]).
{C1, _} = thrift_client:call(C, 'set_keyspace', ["my_keyspace"]).
thrift_client:call(C1,'insert', ["00000001", #columnParent{column_family="mq"}, #column{name="1234567",value="Hello World !", timestamp=0}, 2]).

実際、「set_keyspace」が返す新しい thrift_client に挿入する必要があります...明らかに、thrift を介して行われるすべての呼び出しに対して、新しい thrift_client が生成され、使用される必要があります。

さらに、columnPath の代わりに columnParent を使用する必要があります (理由はまだわかりませんが、うまくいきます)。#column のタイムスタンプは必須です...

これが他の誰かに役立つことを願っています。

于 2012-05-09T13:23:49.783 に答える
0

スリフトレスリングホイールを再発明する代わりに、https://github.com/ostinelli/erlcassaを確認することをお勧めします。

于 2012-05-09T03:30:15.827 に答える