NoSql数据模型的问题

时间:2015-07-01 21:28:34

标签: apache-spark cassandra nosql

作为新手,面对Cassandra数据模型上的数据建模问题。我们计划使用Cassandra进行报告。在报告中,我们需要通过多个参数过滤数据。我们说我们有一个列族

Create table cf_data
(
   Date varchar,
   Attribute1 varchar, 
   Attribute2 varchar,
   Attribute3 varchar,
   Attribute4 varchar,
   Attribute5 varchar,
   Attribute6 varchar,
   Primary Key(Date)
)

我们需要支持

之类的查询
Select * from cf_date where date = '2015-02-02' and Attribute1 in ('asdf','assf','asdf') and Attribute1 in ('wewer','werwe') and Attribute2 in ('sdfsd','werwe') and Attribute3 in ('weryewu','ghjghjh') 

我知道在查询列族时我们需要尊重主键限制。 Cassandra内部存储就像

一样
SortedMap<String,SortedMap<Key,Value>>

NoSQL的工作原理是根据访问模式存储非规范化数据。如果我需要满足上述查询,我​​应该如何建模列族。从报告UI,用户可以选择Attribute1,Attribute2,Attribute3 ....等值作为下拉列表。一种选择可能是在Cassandra节点上使用Spark来支持SQL查询,但是像Cassandra预期的那样,列系列的模型更好。

任何指针??

1 个答案:

答案 0 :(得分:1)

从Datastax CQL文档:

“在大多数情况下,建议不要在WHERE子句中使用IN。使用IN会降低性能,因为通常必须查询许多节点。”

如果您需要使用Spark来支持SQL查询,那么最好使用正确的SQL数据库。仅仅因为NoSQL是一种时尚,你不需要遵循它。并非所有数据都可以在所有NoSQL DB中高效建模。

另一个效率低下的选项是在没有属性本身的情况下进行查询,并在应用程序中对过滤进行编码,但存在响应中产生大延迟的风险。如果报告不是实时或接近实时创建的,那么你应该做得很好。