【问题标题】:Cassandra thrift Erlang insertCassandra thrift Erlang 插入
【发布时间】:2012-05-17 05:58:54
【问题描述】:

我目前正在尝试用 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)

【问题讨论】:

    标签: erlang cassandra thrift


    【解决方案1】:

    我建议查看 https://github.com/ostinelli/erlcassa 而不是重新发明 Thrift-wrestling 轮子。

    【讨论】:

    • 您好,感谢您的回答。我已经知道使用 CQL 的 erlcassa。不幸的是,今天的 CQL 不适合我的需要,在我们讨论的时候它非常有限。例如,它似乎没有插入列族元数据中未描述的列。因此,我的数据模型将为每条消息每行插入一个新列,这对于 CQL 是不可行的。
    【解决方案2】:

    好的,我已经找到了问题所在,或者需要纠正的问题...

    这是我的代码,用于连接和插入...

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

    事实上,我们应该在新的 thrift_client 中插入 'set_keyspace' 返回的...

    此外,我们应该使用 columnParent 而不是 columnPath(现在还不确定为什么,它确实有效)。 #column 中的时间戳是强制性的...

    我希望这对其他人有帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-16
      • 1970-01-01
      • 2013-02-25
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2011-02-15
      • 2015-10-15
      • 2011-01-14
      相关资源
      最近更新 更多