我是卡桑德拉的新手。我不确定是否要多次在一行中添加一组列,例如,我想在同一手机号码时连续添加呼叫相关信息列(timestamp_calling_no、timestamp_tower_id、timestamp_start_time、timestamp_end_time、timestamp_duration、timestamp_call_type 等列)使用 hector/astyanax/java/CQL 拨打电话。
请提出您的建议。提前谢谢。
我是卡桑德拉的新手。我不确定是否要多次在一行中添加一组列,例如,我想在同一手机号码时连续添加呼叫相关信息列(timestamp_calling_no、timestamp_tower_id、timestamp_start_time、timestamp_end_time、timestamp_duration、timestamp_call_type 等列)使用 hector/astyanax/java/CQL 拨打电话。
请提出您的建议。提前谢谢。
很高兴您认识到有许多 API 可用。我建议使用CQL3
,主要是因为现在保留 thrift api 只是为了向后兼容,并且因为CQL
可以与大多数语言一起使用,Astyanax
并且hector
是特定于 java 的。
我会使用复合键(在“集群、复合键等”下)。
//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
在像 Playorm 这样的框架中,有多种方法可以做到这一点。例如,您可以使用@OneToMany 或@NoSqlEmbedded 模式。有关更多详细信息,请访问http://buffalosw.com/wiki/Patterns-Page/
将列添加到一行是一种廉价的操作,而且 cassandra 将列名存储为已排序的另一件事,因此通过使用时间戳作为列名将解决切片问题。cassandra 在 CDR CF 中的一行可以有 20 亿列,所以我们可以轻松地继续添加列。您试图运行一个需要 cassandra 扫描所有行的查询,然后是的,它的性能会很差。