Cassandra上的实时复杂查询

时间:2015-06-05 11:38:52

标签: cassandra

我们正在寻找一种工具(最好是开源),它可以帮助我们实时执行复杂的查询(高级过滤和连接,不需要完整的SQL)。

假设所需的所有数据都适合内存,我们希望尽可能避免地图缩减工具的开销。

更具体地说,我们需要加载单个表的n个分区,并通过聚类列加入它们。

Variables Table:
Variable ID: Partition key
Person ID: Clustering key
Variable Value

Desired output columns:
Person ID, Variable 1 Value, Variable 2 Vale, ..., Variable N Value 

我们可以通过内存中的加载过滤器加入过程来实现它,但是我们想知道是否有任何工具,这个用例开箱即用并具有良好的性能。

我们测试了Spark,但Spark C *连接器的分区基于主键,因此每个变量ID都将加载到不同的Spark节点中,并且连接过程会非常慢(所有数据都会在整个Spark集群中旅行。)

任何提示?已知的工具?

1 个答案:

答案 0 :(得分:0)

我相信你有很多选择来执行这项任务:

  • 重新考虑您的数据库架构,对其进行非规范化。如果你想通过person_id进行查询,那么var_id:person_id:value行不是最好的表模式(它会像entity-attribute-value db antipattern那样闻起来很糟糕):
  

EAV为开发人员提供了根据需要定义架构的灵活性,这在某些情况下很好。另一方面,在查询定义不明确的情况下,它执行得非常糟糕,并且可以支持其他不良做法。换句话说,EAV为你提供足够的绳索让自己挂起来,在这个行业中,事情的设计应该是复杂程度最低的,因为在项目中取代你的人很可能是个白痴。

您可以使用具有多个列的模式(cassandra可以处理很多列):

create table person_data (
  person_id int primary key,
  var1 text,
  var2 text,
  var3 text,
  var4 text,
  ....
);

如果您没有预定义的变量集,则可以使用map等cql3集合以更灵活的方式存储数据。

  • 在person_id上创建二级索引(即使它已经是一个群集密钥)。您可以在不使用联接的情况下查询特定用户的所有数据,但有一些问题:

    • 由于您的查询将涉及多个分区,因此不需要单个磁盘搜索,而是一系列磁盘搜索,因此您的查询延迟可能会高于您的预期。
    • 二级索引不是免费的:如果您向具有索引列的表插入行,C *必须执行更多工作。
  • 使用外部索引,如ElasticSearch / Solr,如果您计划进行大量不符合cql3的复杂查询。