我需要在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 |
这是使用三个独立列系列(如此处所示)对这些故障进行建模的最佳方法吗?
或者更有意义的是只存储最精细的细分,然后使用某种形式的列聚合(如果存在)来提取粒度较小的数据集?
我知道Cassandra的聚合功能有限/不存在,我还没有在API中找到任何建议我如何聚合这样的列。
我知道我可以在应用程序层中进行聚合,但问题是关于检索不必要的数据,移动计算开销和维护其他列系列之间的权衡。我希望Cassandra在数据层提供一些解决方法。
答案 0 :(得分:0)
根据您希望如何建模数据,您可以
使用您的解决方案。在此,您可以创建列族以获取更多详细信息
如果您觉得有太多列系列或者您将始终使用下一列系列,我建议将其作为主键的一部分作为群集键或直接作为分区键的一部分< / p>
例如: 如果根据您的数据模型,如果行键访问始终包含货币,您可以像这样建模
| rowkey |currency|
|---------------|--------|
| 31122014-1,GBP| 112 |
显然,这会更好地传播单个rowkey的数据,但会增加行键的数量
在选择其中一种州政府
之前,请考虑以下事项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
答案 1 :(得分: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)
);