【问题标题】:Schema for tick data on cassandracassandra 上的刻度数据架构
【发布时间】:2017-10-08 04:23:48
【问题描述】:

概述

我想在 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 一次,并且主要在 datesymbol 上的条件下读取,例如给定时间段的一组符号。

问题

  • 元组(symbol,date,time) 不是正确的PRIMARY KEY,因为我的粒度限制为秒。因此,COPY FROM 例如由于键中的重复,在导入期间删除了 csv 的第二行。 如何保存记录

  • 假设PRIMARY KEY 是唯一的,我如何避免存储SYMBOLDATE 的重复值?还是分区在幕后解决了这个问题?

  • 我正在考虑使用以下架构:

    CREATE TABLE tickdata (
    symbol text,
    date date,
    time blob,
    price blob,
    size blob,
    PRIMARY KEY ((symbol,date))
    );
    

    存储原始数据。这是解决上述问题的正确方法吗?

  • 当我SELECT它时,根据PRIMARY KEY的定义,数据是未排序的。这与上面提到的非唯一性问题有关吗?

  • 我是否应该坚持使用我的二进制 file-store 来保存符号和日期的地图并根据要求加载相关文件?这避免了每行重复符号和日期,并且与时间戳的有限粒度(重复)无关。

【问题讨论】:

  • 日期和时间是怎么产生的?你用现在的时间吗??
  • 而你的用例不清楚
  • 数据按原样给出,用例示例可能是:select * from tickdata where date > 2012-01-01 and symbol in (...)

标签: cassandra time-series schema


【解决方案1】:

元组 (symbol,date,time) 不是正确的 PRIMARY KEY,因为我的 粒度限制为秒。因此,COPY FROM 例如滴 由于在导入过程中的重复,csv 的第二行 钥匙。如何保存记录?

第一个表定义中的主键是 ((symbol,date),time) 而不是 (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|

为避免删除记录,您可以再添加一列,例如 uuidtimeuuid

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 的值?或者分区正在处理这个问题 在引擎盖下?

根据上面解释的物理存储结构,这个问题已经解决了。

您正在谈论的备用模式将只有一个符号和一个日期的 1 条记录。您将不得不在应用程序端处理 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); 

我应该坚持使用保存符号映射的二进制文件存储吗 和日期并根据要求加载相关文件?这避免了 每行重复符号和日期,对有限无动于衷 时间戳的粒度(重复)。

你可以自己决定:)

【讨论】:

猜你喜欢
  • 2019-06-15
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 2012-10-19
  • 2011-06-06
  • 2012-07-25
  • 2012-09-17
  • 2013-02-21
相关资源
最近更新 更多