Jdbc 在Cassandra中查询大型数据集

Jdbc 在Cassandra中查询大型数据集,jdbc,cassandra,cql,Jdbc,Cassandra,Cql,根据经验,我是一名RDBMS程序员。我正在研究一个涉及基因组数据的科学研究问题。我被指派去探索卡桑德拉,因为我们需要一个大数据、可扩展且廉价(免费)的解决方案。设置Cassandra并用数据加载它是非常简单的事情,与我使用Oracle和MySQL等传统DBs的经历类似。我的问题是找到一个查询数据的简单策略,因为这是所有数据存储库的基本要求。我正在使用的数据是突变数据集,其中包含位置信息以及与数据相关的计算数字度量。我设置了一个初始静态柱族,如下所示: CREATE TABLE variant (

根据经验,我是一名RDBMS程序员。我正在研究一个涉及基因组数据的科学研究问题。我被指派去探索卡桑德拉,因为我们需要一个大数据、可扩展且廉价(免费)的解决方案。设置Cassandra并用数据加载它是非常简单的事情,与我使用Oracle和MySQL等传统DBs的经历类似。我的问题是找到一个查询数据的简单策略,因为这是所有数据存储库的基本要求。我正在使用的数据是突变数据集,其中包含位置信息以及与数据相关的计算数字度量。我设置了一个初始静态柱族,如下所示:

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);
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'};
正如您所看到的,位置数据有一个自然的主键(chrome、pos、ref和alt)。从查询的角度来看,此数据没有意义。我的客户目前更感兴趣的是提取“AF”值低于某个值的数据。我使用JavaRESTful服务,使用CQLJDBC驱动程序与该数据库交互。很快就很明显,使用AF直接查询这个表是行不通的,因为select语句似乎必须标识您要查看的行键。我在这一点上发现了一些令人困惑的讨论,但我决定做的是,由于AF的不同值低于100,我构建了一个如下所示的查找表:

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);
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时才起作用,但我确实需要使用诸如>、=、之类的函数。您可能希望探索并使用针对Cassandra的Playmorm,因为它可以解决timout限制和分页的问题。当您查询时,PlayOrm返回一个光标,当您的第一页读取前20个结果并显示它时,下一页可以在会话中使用同一个光标,它将在停止的位置向右移动,而无需重新扫描前20行。

请访问以查看光标示例、所有功能以及有关playorm的更多详细信息,谢谢您的支持。我下载并构建了Playorm。在尝试最简单的例子时,我得到了java异常:java.lang.NoClassDefFoundError:org/antlr/runtime/RecognitionException,我已经将这个jar导入到eclipse中的项目中,但它仍然抛出这个运行时错误。你知道为什么它找不到这个库吗?已经通过了这个和其他几个缺少的依赖项。现在我遇到了这个错误:失败扫描类(参见链接异常)=类com.alvazan.orm.api.z8spi.meta.DboColumnMeta。你对这可能意味着什么有什么想法吗?你能分享与之相关的完整错误日志吗。另外,请确保nosql.Persistence.java位于拥有模型类的类路径中。请参阅的常见问题解答,开始和使用的最简单方法是下载源代码,运行./gradlew eclipse,然后导入到eclipse中,然后所有测试用例都可以工作,您可以在eclipse中运行它们。谢谢您的支持。我的项目或PlyORM的下载中肯定没有这个java文件。你能告诉我在哪里能买到吗?