在cassandra中查询大型数据集

jk9hmnmh  于 2021-06-15  发布在  Cassandra
关注(0)|答案(1)|浏览(470)

我是一个有经验的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)。从查询的Angular 来看,这些数据没有意义。我的客户目前更感兴趣的是提取“af”值低于某个值的数据。我使用javarestful服务,使用cqljdbc驱动程序与这个数据库交互。很快就发现,使用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超时限制,用于查询这些数据,这些数据可能会产生1万到数百万条记录。第二个问题是如何通过获取尚未呈现的数据(上一个-下一个链接)在html中呈现这些数据。类似于opscenter显示列族记录数据的方式。由于无法使用>、<、>=、<=等功能限制,这似乎是不可能的。根据我的经验,这可能是因为我对这个产品的实际工作原理缺乏了解,而不是因为缺乏产品的功能(如果数据库只能很好地处理写操作,那么它们就不会很有用)。
有没有人曾经遇到过这个问题并解决过?我非常感谢分享一个如何使用JavaWeb服务实现c*解决方案的示例,以显示大量需要分页的结果。

yzxexxkh

yzxexxkh1#

您可能希望探索并使用cassandra的playmorm,因为它可以解决超时限制和分页的问题。当您查询时,playorm返回一个游标,当您的第一页读取前20个结果并显示它时,下一页就可以在会话中使用同一个游标,并且它会从它离开的地方开始,而不会重新扫描前20行。
访问http://buffalosw.com/wiki/an-example-to-begin-with-playorm/ 查看cursor和http://buffalosw.com/products/playorm/ 有关playorm的所有功能和更多详细信息

相关问题