我们正在寻找一种工具(最好是开源),它可以帮助我们实时执行复杂的查询(高级过滤和连接,不需要完整的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集群中旅行。)
任何提示?已知的工具?
答案 0 :(得分:0)
我相信你有很多选择来执行这项任务:
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上创建二级索引(即使它已经是一个群集密钥)。您可以在不使用联接的情况下查询特定用户的所有数据,但有一些问题:
使用外部索引,如ElasticSearch / Solr,如果您计划进行大量不符合cql3的复杂查询。