Cassandra:表格式映射的架构是什么?

时间:2013-08-12 19:14:32

标签: database-design cassandra schema

我尝试了不同的方法,但我找不到解决问题的方法: 我的数据类似于表格,这意味着我对一组字符串的每个输入组合都有一个数据点(浮点数):

(a mapping of S × S → ℝ )

我想对架构进行建模,以便我可以执行以下查找:

  • 具有特定范围值的所有字符串对
  • 对于给定的输入String,映射值在某个范围内的所有字符串
  • 对于给定的输入字符串组合映射值

由于映射是对称的(m(x,y) == m(y,x)),如果我只需要存储
,那就太棒了 n*(n+1) / 2个唯一值,而不是n^2总映射。

到目前为止我尝试过:

  1. S1 +“”+ S2作为行键,值为列名
  2. S1为行键,复合键为[S2:value]为列名
  3. S1为行键,S2为列名,值为列值。
  4. 但不幸的是,所有这些方法都不允许我做我需要的所有查询。 这在卡桑德拉甚至可能吗?

1 个答案:

答案 0 :(得分:0)

Cassandra不支持您的第一个查询--- 所有字符串值都在某个范围内 ---因为目前,Cassandra只允许范围查询至少有一个{{1}在EQ子句上。但是,您的第二个和第三个查询是可行的:)


示例

考虑以下示例:

WHERE

我们有以下元组:

cqlsh:so> desc table string_mappings;
CREATE TABLE string_mappings (
  s1 ascii,
  s2 ascii,
  value float,
  PRIMARY KEY (s1, s2, value)
) 

您的第一个查询不起作用,因为Cassandra目前不支持cqlsh:so> select * from string_mappings; s1 | s2 | value -------+-------+------- hello | hello | 1 hello | world | 0.2 stack | hello | 0 stack | stack | 1 stack | world | 0 world | world | 1 条款中没有EQ的范围查询:

WHERE

但是,以下范围查询(您的第二个查询)没问题,因为它有一个cqlsh:so> select * from string_mappings where value>0.5; Bad Request: PRIMARY KEY part value cannot be restricted (preceding part s2 is either not restricted or by a non-EQ relation)

EQ

并记住放置cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello' allow filtering; s1 | s2 | value -------+-------+------- hello | hello | 1 关键字,否则您将收到以下错误:

ALLOW FILTERING

最后,您的第三个查询也不是问题:)

cqlsh:so> select * from string_mappings where value > 0.5 and s2='hello';
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance. If you want to execute this query despite the performance unpredictability, use ALLOW FILTERING