我想在cassandra中确定财务计费数据的正确架构。
我在csv中有以下示例数据:
SYMBOL,DATE,TIME,PRICE,SIZE
A,2011-01-03,9:28:00,41.46,200
A,2011-01-03,9:28:00,41.46,100
A,2011-01-03,9:30:00,41.56,1300
A,2011-01-03,9:30:00,41.56,1300
A,2011-01-03,9:30:00,41.55,100
A,2011-01-03,9:30:19,41.55,200
A,2011-01-03,9:30:23,41.5169,100
A,2011-01-03,9:30:29,41.44,66534
A,2011-01-03,9:30:29,41.45,225
A,2011-01-03,9:30:30,41.44,100
A,2011-01-03,9:30:30,41.43,100
A,2011-01-03,9:30:30,41.49,100
A,2011-01-03,9:30:30,41.45,200
我存储到下表中:
CREATE TABLE tickdata (
symbol text,
date date,
time time,
price float,
size int,
PRIMARY KEY ((symbol,date),time)
);
这是表格SELECT
的一部分:
symbol | date | time | price | size
--------+------------+--------------------+---------+-------
A | 2011-01-03 | 09:28:00.000000000 | 41.46 | 100
A | 2011-01-03 | 09:30:00.000000000 | 41.56 | 1300
A | 2011-01-03 | 09:30:19.000000000 | 41.55 | 200
A | 2011-01-03 | 09:30:23.000000000 | 41.5169 | 100
A | 2011-01-03 | 09:30:29.000000000 | 41.45 | 66534
这些数据将被写入Cassandra一次,并且主要在date
和symbol
条件下阅读,例如给定时间段的一组符号。
元组(symbol,date,time)
不是正确的PRIMARY KEY
,因为我的粒度限制为秒。因此,COPY FROM
例如由于密钥中的重复,导致在导入期间删除csv的第二行。 如何保留记录?
假设PRIMARY KEY
是唯一的,我如何避免存储SYMBOL
和DATE
的重复值?或是分区照顾引擎盖?
我在考虑使用以下架构:
CREATE TABLE tickdata (
symbol text,
date date,
time blob,
price blob,
size blob,
PRIMARY KEY ((symbol,date))
);
存储原始数据。这是解决上述问题的正确方法吗?
根据我PRIMARY KEY
时SELECT
的定义,数据未订购。这与上面提到的非唯一性问题有关吗?
我应该坚持使用二进制文件存储来保存符号和日期的地图,并根据要求加载相关文件?这样可以避免重复每行的符号和日期,并且对时间戳的有限粒度(重复)无动于衷。
答案 0 :(得分:2)
元组(符号,日期,时间)不是合适的PRIMARY KEY,因为我的 粒度限制为秒。因此,COPY FROM例如放弃了 导入过程中由于重复导致的第二行csv 键。我该如何保存记录?
第一个表定义中的主键是((symbol,date),time)
NOT (symbol,date,time)
。两者在cassandra中都有所不同。
((symbol,date),time)
=>将相同符号(A)和日期的所有记录存储在一个节点中。对于相同的符号(A),但其他日期可能会在其他节点上。
行键为符号+日期
物理数据布局(示例)
|A_2011-01-03||time1.price & time1.value||time2.price & time2.value|
|A_2011-01-04||time1.price & time1.value||time2.price & time2.value|
|B_2011-01-03||time1.price & time1.value||time2.price & time2.value|
|B_2011-01-04||time1.price & time1.value||time2.price & time2.value|
(symbol,date,time)
=>相同符号的所有记录将驻留在一个节点上。这可能会导致宽行。
行键将是符号。
物理数据布局(示例)
|A||date1.time1.price & date1.time1.value||date1.time2.price & date1.time2.value||date2.time1.price & date2.time1.value||date2.time2.price & date2.time2.value|
|B||date1.time1.price & date1.time1.value||date1.time2.price & date1.time2.value||date2.time1.price & date2.time1.value||date2.time2.price & date2.time2.value|
要避免删除记录,您可以再添加一列,例如uuid
或timeuuid
CREATE TABLE tickdata (
symbol text,
date date,
time time,
price float,
size int,
id timeuuid
PRIMARY KEY ((symbol,date),time,id)
);
假设PRIMARY KEY是唯一的,我怎样才能避免重复存储 SYMBOL和DATE的值?或正在进行分区处理 在引擎盖下?
基于上面解释的物理存储结构,这个问题已经得到解决。
您正在讨论的备用架构只有一个符号和一个日期的记录。你将不得不在应用程序端处理blob ......我认为这可能是开销。
根据PRIMARY KEY的定义,不对数据进行排序 当我选择它。这与非唯一性问题有关 上面提到过?
默认情况下,数据按聚类键按升序排序(在您的情况下为时间)。虽然您可以通过将表的CLUSTERING ORDER BY属性更改为降序来更改顺序。
示例:
CREATE TABLE tickdata (
symbol text,
date date,
time time,
price float,
size int,
id timeuuid
PRIMARY KEY ((symbol,date),time,id)
) WITH CLUSTERING ORDER BY(time desc,id desc);
我应该坚持使用保存符号图的二进制文件存储 和日期并根据要求加载相关文件?这避免了 重复每一行的符号和日期,并且对有限的无动于衷 时间戳的粒度(重复)。
你可以自己决定:)