【问题标题】:data modeling in cassandra for CDR datacassandra 中用于 CDR 数据的数据建模
【发布时间】:2013-04-02 19:34:24
【问题描述】:

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

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

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    在设计 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 中查询两个日期/时间范围之间的所有列,并解析结果以获取调用次数最多的数字。

    【讨论】:

    • 感谢您的详细描述,这对我以正确的方式进行有很大帮助..
    • 我不确定这个功能,即我们是否可以在不同时间重复添加一组列?请发表你的意见。
    • 但在 CDR_column_family 中,如果我们正在考虑 mob。不。作为行键,行数会非常高(比如在印度,大约有 9.6 亿用户,所以行数将是 9.6 亿)。因此,它可能会导致性能下降。
    • 我相信将列添加到一行是一个相当便宜的操作。另外,请记住,Cassandra 将为您自动排序列,因此使用时间戳 (timeuuid) 作为列名意味着 cassandra 可以快速找到两个日期之间的列范围。关于在 CDR CF 中有十亿行,您只会使用此表来查询特定的手机号码,因此 cassandra 只需获取最多几行即可满足查询 - 这意味着快速的性能。如果您尝试运行需要 cassandra 扫描所有行的查询,那么是的,它的性能会很差。
    猜你喜欢
    • 2016-10-04
    • 2018-03-08
    • 1970-01-01
    • 2015-12-25
    • 2015-04-09
    • 2014-08-14
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多