用于CDR数据的cassandra数据建模

时间:2013-04-01 10:15:54

标签: cassandra

我正在尝试在cassandra中为CDR(呼叫详细记录)数据设计一个数据模型,以便我们可以存储并保持在同一个移动号码的同一行中添加呼叫详细信息,或者为每个呼叫动态添加一组列通过相同的手机号码。它也可以支持查询,   哪个手机号码称为两个给定日期或给定时间之间的最大时间(例如,上午9点到晚上7点之间)?

您的建议非常值得赞赏。提前致谢。

1 个答案:

答案 0 :(得分:2)

在设计Cassandra数据模型时,首先需要列出需要满足的所有查询。考虑传入的CDR数据量(以便您可以正确地对数据进行分片)以及每个查询可能运行的频率(以便高频查询与快速读取性能相匹配)也很重要。

由于Cassandra的非关系性质以及CQL的有限查询功能(与传统RDS相比),数据库设计在很大程度上取决于您需要运行的查询。根据您的示例,您可能需要多个列族来满足这些类型的查询。

作为起点,在存储原始CDR方面,您可以拥有一个“宽行”列系列,其中行键是移动号码,列名称是调用时的时间戳。然后,对于每个进入的CDR,您只需在与该移动号码匹配的行中添加新列。

CDR_column_family
    mobile_number <- row key
        timestamp:null <- column name:column value

这里需要注意的是行的宽度。如果你每天处理奇怪的呼叫,那么这可能就足够了,但如果它每天更像是数百次呼叫,你可能想要对数据进行分片以免降低性能。因此,您的行键可能会成为手机号码/月份合成(例如“07870 831137:201304”),每个手机号码每月会有一行。

此CF将满足诸如“在上午9点至下午7点之间向07870 831137进行了多少次调用”之类的查询,但它不会告诉您“在上午9点到下午7点之间调用的号码最多”,而不查询CF中的每一行(在分布式数据库中,它不会特别有效。)

对于像“在上午9点和下午7点之间调用最多的号码”这样的查询,我会考虑第二个CF,它会列出按时间顺序排列的所有电话。

CallIndex_column_family
    month <- row key
        timestamp:mobile_number <- column name:column value

因此,每当您写入CDR CF时,您还会向CallIndex CF添加一个新列,列出呼叫时间和拨打的号码。然后,您可以在CallIndex CF中查询两个日期/时间范围之间的所有列,并解析结果以获取被称为最多的数字。