小编Nik*_*iev的帖子

get_range_slices和CQL查询处理,需要ALLOW FILTERING

我有一个以下的CQL表(为了清晰起见,有点简化):

CREATE TABLE test_table (
    user        uuid,
    app_id      ascii,
    domain_id   ascii,
    props       map<ascii,blob>,
    PRIMARY KEY ((user), app_id, domain_id)
)
Run Code Online (Sandbox Code Playgroud)

这个想法是这个表将包含许多用户(即行数,例如数十亿).对于每个用户,会有一些感兴趣的域,每个域会有一些应用程序.对于每个用户/域/应用程序,将有一小组属性.

我需要扫描整个表并将其内容加载到给定的app_id和domain_id的块中.我的想法是使用TOKEN函数能够在几次迭代中读取整个数据集.所以,像这样:

SELECT props FROM test_table WHERE app_id='myapp1'
  AND domain_id='mydomain1'
  AND TOKEN(user) > -9223372036854775808
  AND TOKEN(user) < 9223372036854775807;
Run Code Online (Sandbox Code Playgroud)

我假设这个查询是有效的,因为我指定了行键的范围,并通过指定聚类键的值,我有效地指定了列范围.但是当我尝试运行此查询时,我收到错误消息"错误请求:无法执行此查询,因为它可能涉及数据过滤,因此可能具有不可预测的性能.如果要执行此查询,尽管性能不可预测,请使用ALLOW FILTERING" .

我对Cassandra的经验有限,我认为这种查询会映射到get_range_slices()调用,它接受切片谓词(即我的app_id/domain_id值定义的列范围)和我的令牌范围定义的键范围.似乎我误解了这种查询是如何处理的,或者我误解了get_range_slices()调用的效率.

更具体地说,我的问题是: - 如果这个数据模型确实对我想到的查询类型有意义 - 如果预期这个查询是有效的 - 如果它是有效的,那么为什么我收到此错误消息我允许过滤

我对最后一个的唯一猜测是,需要从结果中跳过没有给定app_id/domain_id组合的行.

---更新----

感谢所有评论.我一直在对此进行更多的研究,但仍有一些我不完全理解的东西.

在给定的结构中,我想要得到的就像我的数据集中的矩形区域(假设所有行具有相同的列).矩形的顶部和底部由标记范围(范围)确定,左/右边定义为列范围(切片).因此,这应该自然地转换为get_range_slices请求.我的理解(纠正我,如果我错了)CQL要求我放置ALLOW FILTERING子句的原因是因为会有不包含我要查找的列的行,所以必须跳过它们.并且由于没有人知道在找到符合我的标准(在给定范围内)之前是否必须跳过每隔一行或第一百万行 - 这就是导致不可预测的延迟甚至可能超时的原因.我对吗?我曾尝试编写一个执行相同类型查询但使用低级Astyanax API的测试(在同一个表中,我必须读取使用CQL生成的数据,结果证明非常简单)并且此测试确实有效 - 除了它返回没有列的键,其中行不包含我要求的列片.当然,我必须基于起始令牌实现某种简单的分页,并限制以小块的形式获取数据.

现在我想知道 - 再次,考虑到我需要处理数十万用户:部分"旋转"这个表并将其组织成这样的事情会更好:

行键:domain_id + app_id +分区号(类似哈希(用户)mod X)聚类键:列分区号(类似哈希(用户)>> 16 mod Y)+用户

对于"列分区否"...我不确定是否真的需要它.我假设如果我使用这个模型,我将为每个域+应用程序组合提供相对较少的行数(X = 1000..10000).如果我愿意,这将允许我查询各个分区,即使是并行查询.但是(假设用户是随机UUID)对于100M用户来说,每行将产生数十或数十万列.在一个请求中读取这样一行是不是一个好主意?我相信它应该为Cassandra造成一些记忆压力.所以也许分组阅读(比如,Y = 10..100)会更好吗?

我意识到我要做的不是Cassandra做得好 - 读取可以预先计算的块中的"全部"或大部分CF数据(如令牌范围或分区键),以便从不同主机进行并行获取.但我试图找到一种对这种用例最有效的模式.

顺便说一下,查询如"select*from ... where …

cql cassandra cql3

1
推荐指数
1
解决办法
4959
查看次数

标签 统计

cassandra ×1

cql ×1

cql3 ×1