【问题标题】:Querying Large Datasets in Cassandra在 Cassandra 中查询大型数据集
【发布时间】:2013-05-15 16:14:22
【问题描述】:

根据经验,我是一名 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 所宣传的那样工作,但我确实需要使用像 >、=、

我有两个主要问题,第一个是查询这些数据的 rpc 超时限制,这些数据可能会产生数千到数百万条记录。第二个问题是如何通过获取尚未呈现的数据(上一个 - 下一个链接)在 HTML 中呈现这些数据。类似于 opscenter 显示列族记录数据的方式。由于无法使用 >、=、

有没有人遇到过这个问题并解决过?我非常感谢分享一个示例,说明如何使用 Java Web 服务实现 C* 解决方案,以显示大量需要分页的结果。

【问题讨论】:

    标签: jdbc cassandra cql


    【解决方案1】:

    您可能想探索和使用 Playorm for Cassandra,因为它可以解决您的超时限制和分页问题。 PlayOrm 在您查询时返回一个光标,当您的第一页读取前 20 个结果并显示它时,下一页可以在您的会话中使用相同的光标,并且它会从停止的地方重新开始,而无需再次重新扫描前 20 行.
    访问http://buffalosw.com/wiki/An-example-to-begin-with-PlayOrm/查看光标示例,访问http://buffalosw.com/products/playorm/查看所有功能以及有关playorm的更多详细信息

    【讨论】:

    • 感谢 Easility。我下载并构建了 Playorm。在尝试最简单的示例时,我得到了 java 异常:java.lang.NoClassDefFoundError: org/antlr/runtime/RecognitionException 我已经将这个 jar 导入到我在 Eclipse 中的项目中,但它仍然抛出这个运行时错误。你知道为什么它找不到这个库吗?
    • 克服了这个和其他几个缺失的依赖项。现在我遇到了这个错误:失败扫描类(参见链式异常)=class com.alvazan.orm.api.z8spi.meta.DboColumnMeta。对这可能意味着什么有任何想法?
    • 您能否分享与之相关的完整错误日志。此外,请确保 nosql.Persistence.java 在您的类路径中,您的模型类所在的位置。请参阅buffalosw.com/wiki/FAQ 的常见问题解答
    • 另外,最简单的开始和玩的方法是下载源代码,运行 ./gradlew eclipse 然后导入到 eclipse 中,然后所有的测试用例都可以工作,你可以在 eclipse 中运行它们。
    • 感谢 Easility。我的项目或 PlyORM 下载中绝对没有这个 java 文件。你能告诉我在哪里获得它吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-07-11
    • 1970-01-01
    • 2016-03-22
    • 1970-01-01
    相关资源
    最近更新 更多