查询Cassandra中的大型数据集

时间:2013-05-21 01:34:24

标签: jdbc cassandra cql

我是一名经验丰富的RDBMS程序员。我正在研究涉及基因组数据的科学研究问题。我被分配去探索Cassandra,因为我们需要大数据,可扩展且便宜(免费)的解决方案。设置Cassandra并使用数据加载它是诱人的微不足道的,类似于我对Oracle和MySQL等传统数据库的经验。我的问题是找到一种查询数据的简单策略,因为这是所有数据存储库的基本要求。我正在使用的数据是变异数据集,其中包含位置信息以及有关数据的计算数值度量。我设置了一个初始静态列族,如下所示:

CREATE TABLE variant (
chrom text,
pos int,
ref text,
alt text,
aa text,
ac int,
af float,
afr_af text,
amr_af text,
an int,
asn_af text,
avgpost text,
erate text,
eur_af text,
ldaf text,
mutation_id text,
patient_id int,
rsq text,
snpsource text,
theta text,
vt text,
PRIMARY KEY (chrom, pos, ref, alt)
) WITH
bloom_filter_fp_chance=0.010000 AND
caching='KEYS_ONLY' AND
comment='' AND
dclocal_read_repair_chance=0.000000 AND
gc_grace_seconds=864000 AND
read_repair_chance=0.100000 AND
replicate_on_write='true' AND
populate_io_cache_on_flush='false' AND
compaction={'class': 'SizeTieredCompactionStrategy'} AND
compression={'sstable_compression': 'SnappyCompressor'};

CREATE INDEX af_variant_idx ON variant (af);

正如您所看到的,位置数据有一个自然的主键(chrome,pos,ref和alt)。从查询的角度来看,这些数据没有意义。目前我的客户更感兴趣的是提取“AF”值低于某个值的数据。我使用Java restful服务使用CQL JDBC驱动程序与此数据库进行交互。很快就发现直接查询此表将无法使用AF,因为看起来select语句必须标识要查看的行键。我在这一点上发现了一些令人困惑的讨论,但我决定做的是因为AF的不同值低于100值,我构建了一个如下所示的查找表:

CREATE TABLE af_lookup (
  af_id float,
  column1 text,
  column2 text,
  value text,
  PRIMARY KEY (af_id, column1, column2)
 ) WITH COMPACT STORAGE AND
 bloom_filter_fp_chance=0.010000 AND
 caching='KEYS_ONLY' AND
 comment='' AND
 dclocal_read_repair_chance=0.000000 AND
 gc_grace_seconds=864000 AND
 read_repair_chance=0.100000 AND
 replicate_on_write='true' AND
 populate_io_cache_on_flush='false' AND
 compaction={'class': 'SizeTieredCompactionStrategy'} AND
 compression={'sstable_compression': 'SnappyCompressor'};

这是一个非常宽的行的动态表。我根据存储在静态列族中的数据填充了此表。 'AF'值是键,另一个表中的复合键由' - '(即1-129-T-G)连接,并作为动态列名存储为字符串。这工作正常,但我仍然不明白所有这些事情是如何协同工作的。动态列族似乎只能像使用CQL -2那样宣传,但我真的需要使用像>,<,> =,< =这样的函数。看起来这在理论上是可行的,但我在过去4周内没有找到解决方案来尝试一些不同的工具(我尝试过astyanax以及JDBC驱动程序)。

我有两个主要问题,第一个是查询这些数据的rpc超时限制,这些数据可能产生数十万到数百万条记录。第二个问题是如何通过获取尚未呈现的数据(上一个 - 下一个链接)以HTML格式呈现这些数据。与opscenter显示列族记录数据的方式类似。由于无法使用>,<,> =,< =的功能限制,这似乎不可能实现。根据我的经验,这可能是我对这个产品如何真正起作用缺乏了解而不是缺乏产品的能力(如果数据库只能很好地处理写入,那么数据库将不会非常有用)。 p>

有没有人遇到过这个问题并且之前已经解决了?我非常感谢分享一个如何使用Java Web服务实现C *解决方案的示例,以显示必须通过分页的大量结果。

1 个答案:

答案 0 :(得分:2)

您可能希望探索并使用Playorm for Cassandra,因为它可以解决您的限制和分页问题。 PlayOrm在您查询时返回一个光标,当您的第一个页面读入前20个结果并显示它时,下一页可以在您的会话中使用相同的光标,它会从中断处继续拾取而不再重新扫描前20行。
访问http://buffalosw.com/wiki/An-example-to-begin-with-PlayOrm/查看光标示例,http://buffalosw.com/products/playorm/查看所有功能以及有关playorm的详细信息