卡桑德拉时间序列:允许过滤,桶或其他

Jak*_*ene 2 database data-modeling time-series cql cassandra

我知道这里有很多时间序列问题,但我似乎并不适合给定的解决方案.我也是Cassandra的新手,所以我可能会用错误的心态接近这个.忍受我.

我收到以下表格中的搜索数据:

datetime_searched, term_used, product_found
Run Code Online (Sandbox Code Playgroud)

以及我想做的查询:

给定开始日期和结束日期,返回属于该时间窗口的所有术语 - 产品对.最初,窗口将持续一个月.这可能(读:会)改变.

例如,给出以下数据:

2013-11-20 00:00:00, "christmas", "decorated tree"
2014-12-01 20:00:00, "christmas", "wrapping paper"
2014-12-23 15:00:00, "christmas", "decorated tree" (duplicate term-product)
Run Code Online (Sandbox Code Playgroud)

以及对2014-12-01到2015-01-01时间范围的查询,我希望能够检索:

"christmas", "wrapping paper"
"christmas", "decorated tree"
Run Code Online (Sandbox Code Playgroud)

我的初始方法看起来像时间序列数据的大多数示例:

CREATE TABLE search_terms (
  datetime_searched timestamp,
  term_used text,
  product_found text,
  PRIMARY KEY (term_used, date_searched)
);

SELECT term_used, product_found
FROM search_terms 
WHERE datetime_searched > [start] 
AND datetime_searched < [end];
Run Code Online (Sandbox Code Playgroud)

但这需要我有二级索引和/或允许过滤,这似乎是我应该避免的,如果我只捕获一小部分被过滤的数据.

我的第二个想法是创建时间桶,但这个解决方案似乎只有在我将查询限制在桶时才有效.它似乎也创造了热点 - 在我最初的情况下,是一个长达一个月的热点.例如,对于每日桶:

CREATE TABLE search_terms_by_day (
  datetime_searched timestamp,
  day_searched timestamp,
  term_used text,
  product_found text,
  PRIMARY KEY (day_searched)
);

SELECT term_used, product_found
FROM search_terms_by_day
WHERE day_searched=[my limited query's bucket];
Run Code Online (Sandbox Code Playgroud)

那么我的选择是什么?我是否将我的请求限制在桶大小,可能会创建许多具有不同桶大小的CF,同时创建热点; 我被迫使用二级索引; 还是有其他我不知道的选择?

提前致谢.

Jak*_*ene 5

写这个问题帮助我解决了一些问题.我想出了一个替代解决方案,我或多或少都很满意,但需要一些微调.

有可能计算我们需要访问的所有时间桶,使用过滤器查询每个桶以获取我们需要的条目.

CREATE TABLE search_terms_by_day_of_year (
  day_searched int, // 1 - 366
  datetime_searched timestamp,
  term_used text,
  product_found text,
  PRIMARY KEY (day_searched, datetime_searched, term_used, product_found)
);

// Make N of these, with a different day_searched
SELECT term_used, product_found
FROM search_terms_by_week
WHERE day_searched = 51
AND datetime_searched > [start]
AND datetime_searched < [end]
Run Code Online (Sandbox Code Playgroud)

正面:

  • 避免扫描所有搜索数据
  • 允许更小的时间桶,从而减少我们的热点

劣势:

  • 需要逻辑来确定所需的分区键
  • 在存储桶期间将有一个写入热点(在上面的例子中,一天)
  • 与查询范围相关的桶大小选择不佳将需要查看所有桶,否定任何收益.
  • 对数据库的多个查询.桶越小,所需的呼叫越多.

如果有更好的解决方案,请告诉我