在cassandra中添加一排列

时间:2013-04-04 04:46:35

标签: cassandra

我是cassandra的新手。我不确定连续多次添加一组列,例如,我想在每当相同的手机号码时添加调用相关信息列(如timestamp_calling_no,timestamp_tower_id,timestamp_start_time,timestamp_end_time,timestamp_duration,timestamp_call_type等列)使用hector / astyanax / java / CQL进行调用。

请提出您的建议。 Thanx提前。

3 个答案:

答案 0 :(得分:1)

您认识到有许多API可用,这是很好的。我建议使用CQL3,主要是因为现在保留thrift apis只是为了向后兼容,因为CQL可以用于大多数语言,而Astyanaxhector是特定于java的

我使用compound key(在“群集,复合键等”下)。

//An example keyspace using CQL2
cqlsh>
 CREATE KEYSPACE calls WITH strategy_class = 'SimpleStrategy'
 AND strategy_options:replication_factor = 1;

//And next create a CQL3 table with a compound key
//Compound key is formed from the number and call's start time
cqlsh>
 CREATE TABLE calls.calldata (
      number text,
      timestamp_start_time timestamp,
      timestamp_end_time timestamp,
      PRIMARY KEY (number, timestamp_start_time)
    ) WITH COMPACT STORAGE

上述模式允许您多次插入包含与键相同的数字的行,但由于调用的开始是键的一部分,因此它将确保组合每次都创建一个唯一键。

接下来使用CQL3插入一些测试数据(用于课程示例)

cqlsh>  //This example data below uses 2 diffrent numbers
 insert into calls.calldata (number, timestamp_start_time, timestamp_end_time)
 values ('+441234567890', 1335361733545850, 1335361773545850);
 insert into calls.calldata (number, timestamp_start_time, timestamp_end_time)
 values ('+440987654321', 1335361734678700, 1335361737678700);
 insert into calls.calldata (number, timestamp_start_time, timestamp_end_time)
 values ('+441234567890', 1335361738208700, 1335361738900032);
 insert into calls.calldata (number, timestamp_start_time, timestamp_end_time)
 values ('+441234567890', 1335361740100277, 1335361740131251);
 insert into calls.calldata (number, timestamp_start_time, timestamp_end_time)
 values ('+440987654321', 1335361740176666, 1335361740213000);

现在我们可以检索所有数据(再次使用CQL3):

cqlsh> SELECT * FROM calls.calldata;

 number        | timestamp_start_time      | timestamp_end_time
---------------+---------------------------+---------------------------
 +440987654321 | 44285-12-05 15:11:18+0000 | 44285-12-05 16:01:18+0000
 +440987654321 | 44285-12-05 16:42:56+0000 | 44285-12-05 16:43:33+0000
 +441234567890 | 44285-12-05 14:52:25+0000 | 44285-12-06 01:59:05+0000
 +441234567890 | 44285-12-05 16:10:08+0000 | 44285-12-05 16:21:40+0000
 +441234567890 | 44285-12-05 16:41:40+0000 | 44285-12-05 16:42:11+0000

或部分数据。因为使用了复合键,所以您可以使用CQL3检索特定数字的所有行:

cqlsh> SELECT * FROM calls.calldata WHERE number='+441234567890';     

 number        | timestamp_start_time      | timestamp_end_time
---------------+---------------------------+---------------------------
 +441234567890 | 44285-12-05 14:52:25+0000 | 44285-12-06 01:59:05+0000
 +441234567890 | 44285-12-05 16:10:08+0000 | 44285-12-05 16:21:40+0000
 +441234567890 | 44285-12-05 16:41:40+0000 | 44285-12-05 16:42:11+0000

如果您想要真正具体,您可以检索特定时间呼叫开始的特定号码(再次感谢复合键)

    cqlsh> SELECT * FROM calls.calldata WHERE number='+441234567890' 
           and timestamp_start_time=1335361733545850;

 number        | timestamp_start_time      | timestamp_end_time
---------------+---------------------------+---------------------------
 +441234567890 | 44285-12-05 14:52:25+0000 | 44285-12-06 01:59:05+0000

答案 1 :(得分:1)

在像Playorm这样的框架中,有多种方法可以做到这一点。对于例如你可以使用@OneToMany或@NoSqlEmbedded模式。有关详细信息,请访问http://buffalosw.com/wiki/Patterns-Page/

答案 2 :(得分:1)

向行添加列是一种廉价的操作,而且cassandra还将列名称存储为排序,因此通过使用timestamp作为列名将解决切片问题.cassandra可以在CDR中连续使用20亿列CF,所以我们可以轻松地继续添加列。 你试图运行一个查询,要求cassandra扫描所有行然后是,它会表现不佳。