我是一名 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-TG)连接并存储为字符串作为动态列名。这工作正常,但我仍然不明白所有这些东西是如何协同工作的。动态列族似乎只能像使用 CQL -2 所宣传的那样工作,但我确实需要使用像 >、<、>=、<= 这样的函数。这似乎在理论上是可能的,但在过去 4 周尝试了许多不同的工具(我尝试了 astyanax 以及 JDBC 驱动程序)后,我还没有找到解决方案。
我有两个主要问题,第一个是查询这些数据的 rpc 超时限制,这些数据可能会产生数千到数百万条记录。第二个问题是如何通过获取尚未呈现的数据(上一个 - 下一个链接)在 HTML 中呈现这些数据。类似于 opscenter 显示列族记录数据的方式。由于无法使用 >、<、>=、<= 的功能限制,这似乎是不可能的。根据我的经验,这可能是我对这个产品的真正工作原理缺乏了解,而不是缺乏产品的功能(如果数据库只能很好地处理写入,它们就不会很有用)。
有没有人遇到过这个问题并以前解决过?我非常感谢分享一个示例,说明如何使用 Java Web 服务实现 C* 解决方案,以显示大量需要分页的结果。