2012-05-08 14 views
5

Obecnie próbuję uzyskać moja głowa owinąć wokół Cassandry/oszczędności z Erlang ...Cassandra oszczędność Erlang wstawić

mam rodzinę kolumnę o nazwie „MQ” (jak w kolejce komunikatów) ...

Chciałbym mieć wiersz na użytkownika (z identyfikatorem użytkownika), każda wiadomość byłaby nową kolumną z datą dla nazwy i wiadomości jako wartością.

Oto w Cassandra-cli co robię:

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'; 

Wszystko działa świetnie z Cassandrą-cli

Jednak, gdy próbuję wstawić z Erlang, biegnę do jakiś problem:

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 
        ] 
        ). 

Oto błąd:

{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]}}} 

Każda pomoc będzie mile widziane ...

EDIT 1:

I odkryli, że powinno być (jak to działa dla kogoś innego):

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

Oto powiązany komunikat o błędzie:

** 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) 

Odpowiedz

1

Ok znalazłem się, co było problemem, czy problemy są poprawne ...

Oto mój kod w celu połączenia i wstawić ...

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]). 

W rzeczywistości powinniśmy wkładać do nowego thrift_client, który "set_keyspace" zwraca ... najwyraźniej za każde wywołanie wykonane przez oszczędność generowany jest nowy thrift_client i powinno się go używać.

Co więcej, powinniśmy użyć columnParent zamiast columnPath (nie wiesz, dlaczego jeszcze to działa). A znacznik czasu w kolumnie # jest obowiązkowy ...

Mam nadzieję, że to pomoże komuś innemu.

0

zalecam sprawdzanie https://github.com/ostinelli/erlcassa I Zamiast ponownie wymyślać koło ratowniczo-zapasowe.

+0

Cześć, i dziękuję za odpowiedź. Jestem już świadomy erlcassa, który używa CQL. Niestety, dzisiaj CQL nie pasuje do moich potrzeb, jest dość ograniczone w czasie, gdy rozmawiamy. Na przykład nie wydaje się wstawiać kolumn, które nie zostały opisane w metadanych rodziny kolumn. Tak więc mój model danych, który wstawi nową kolumnę w wierszu dla każdej wiadomości, nie jest opłacalny z CQL. – TheSquad