2015-02-09 41 views
1

我需要在Apache Cassandra中建模和存储财务数据。Apache Cassandra中的财务数据分析建模?

数据按日期和业务单位进行访问,所以目前我的模型使用日期和业务单位ID作为复合行键。

我想使用宽行,这样我就可以在一个查询中将数字拉到一整天(和单位)。

对于任何给定的一天,对于特定的业务单位,我需要存储一系列越来越精细故障的,像这样(忽略的人物,他们是纯粹的举例):

| rowkey  | USD | GBP | JPY | etc ....  
|-------------|-------|------|------|----------  
| 31122014-1 | 112 | 3006 | 234 |  
| 31122014-2 | 3378 | -12.4| 998 |  
| 31122014-3 | -456 | 2034 | 127 | 

然后一个更详细的分类,使用化合物列:

| rowkey  | USD-D1 | USD-D2 | GBP-D1 | GBP-D2 | etc ....  
|-------------|--------|--------|--------|------------------  
| 31122014-1 | 65 | 54  | 175 | 29  | 
| 31122014-2 | 2003 | -6.4 | 603 | 349 | 
| 31122014-3 | -230 | -198 | -53 | 217 | 

然后一个更详细的分类:

| rowkey  | USD-D1-X1 | USD-D1-X2 | USD-D1-X3 | USD-D2-X1 | etc ....  
|-------------|-----------|-----------|-----------|-----------|-------  
| 31122014-1 | 23  | 16  | 98  | 29  | 
| 31122014-2 | 389  | -3.2  | 237  | 119  | 
| 31122014-3 | -105  | -67  | -28  | 178  | 

这是使用三个独立的列系列对这些故障进行建模的最佳方法(如此处所示)?

或者只存储最细粒度的细分,然后使用某种形式的列聚合(如果存在)来提取不太细化的数据集会更有意义吗?

我知道卡桑德拉的聚合能力是有限/不存在的,我没有在API中找到任何东西来建议我如何聚合这样的列。

我知道我可以在应用层进行聚合,但问题是关于检索不必要的数据,移动计算开销和维护额外的列族之间的权衡。我希望Cassandra提供了一些在数据层解决这个问题的方法。

+0

卡桑德拉不支持那种你问及可能永远聚合的将。然而,有完整的分析包可以与Cassandra集成以提供这些功能。您最好的选择是DataStax Enterprise,使用他们的Hadoop/Spark集成,或者搞清楚如何在Cassandra集群上自己使用OSS Spark-Cassandra连接器。 – mildewey 2015-02-10 23:22:36

回答

0

取决于你如何想你想要的数据进行建模,您可以

  1. 使用您的解决方案。在此创建一个列族以获得更多详细信息

  2. 如果您觉得列族太多或者您将始终使用下一列家族,我建议将其作为主键的一部分作为群集键或直接作为分区键

的一部分。例如: 如果按照你的数据模型,如果行键访问总是要包括货币,你可以像这样

| rowkey  |currency|  
|---------------|--------| 
| 31122014-1,GBP| 112 | 

模型Obviou狡猾,这将使您的数据单行rowkey更好,但会增加行键

  1. 您可以使用聚合以及cassandra允许的自定义类型。

,请考虑以下选择策略及DCS

a. Distribution of the rows across nodes 
b. Sparse columns vs wide columns 
c. Effects on row cache (if you are going to turn it on) and key cache 
d. And the most important, your selection queries 
0

的人之前,我认为您的解决方案可能是有效的。对于Cassandra来说,根据您希望针对它执行哪些查询,将数据存储在多个地方通常会更好。

如果您将这些用例中的每一个看作三个不同的用例,将在不同的时间查询,那么您将得到一个可靠的数据模型。

对于它的价值,这种使用情况下起到很好地CQL的优势这将如下模型,可以:

CREATE TABLE finance0 (
    day DATE, 
    unit INT, 
    currency TEXT, 
    amount BIGINT, 
    PRIMARY KEY ((day, unit) currency) 
); 

CREATE TABLE finance1 (
    day DATE, 
    unit INT, 
    currency TEXT, 
    sorter1 TEXT, 
    amount BIGINT, 
    PRIMARY KEY ((day, unit) currency, sorter1) 
); 

CREATE TABLE finance2 (
    day DATE, 
    unit INT, 
    currency TEXT, 
    sorter1 TEXT, 
    sorter2 TEXT, 
    amount BIGINT, 
    PRIMARY KEY ((day, unit) currency, sorter1, sorter2) 
);