【问题标题】:alllow filtering, data modeling in cql允许过滤,cql中的数据建模
【发布时间】:2013-09-12 17:11:54
【问题描述】:

我目前正在使用和研究 cassandra 中的数据建模实践。到目前为止,我知道您需要基于执行的查询进行数据建模。但是,多个select 要求使数据建模更加困难或不可能在一张表上处理。因此,当您无法在 1 个表上处理这些要求时,您需要插入 2-3 个表。换句话说,您需要在 1 次操作中进行多次插入。

目前,我正在处理广告系列结构的数据模型。我在 cassandra 上有一个带有以下 cql 的活动表;

CREATE TABLE campaign_users
(
    created_at timeuuid,
    campaign_id int,
    uid bigint,
    updated_at timestamp,
    PRIMARY KEY (campaign_id, uid),
    INDEX(campaign_id, created_at)
);

在此模型中,我需要能够仅在给定时间戳的情况下进行增量导出。在 cassandra 中,有allow filtering 模式可以启用对二级索引的select 查询。所以,我的增量导出的 cql 语句如下;

select campaign_id, uid 
from campaign_users
where created_at > minTimeuuid('2013-08-14 12:26:06+0000') allow filtering;

但是,如果使用允许过滤,则会出现警告,指出该语句具有不可预测的性能。那么,依赖 allow filtering 是一个好习惯吗?还有什么其他选择?

【问题讨论】:

  • CQL 是否发生了变化,或者该语法有什么问题?我看不到CREATE TABLE 内的INDEX 的位置是允许的,我也不允许单独创建索引:CREATE INDEX ON campaign_users(campaign_id, created_at);

标签: cassandra


【解决方案1】:

ALLOW FILTERING 警告是因为 Cassandra 在内部跳过数据,而不是使用索引和查找。这是不可预测的,因为您不知道 Cassandra 将跳过每行返回的数据量。在最坏的情况下,您可能正在扫描所有数据以返回零行。这与没有 ALLOW FILTERINGSELECT COUNT 查询除外)的操作形成对比,其中读取的数据随返回的数据量线性扩展。

如果您要返回大部分数据,这没关系,因此跳过的数据不会花费太多。但是,如果您跳过大部分数据,则会浪费大量工作。

另一种方法是将时间包含在您的主键的第一个组件中,在存储桶中。例如。您可以拥有日存储桶,并为包含您需要的数据的每一天重复查询。这种方法保证 Cassandra 读取的大部分数据都是您想要的数据。问题是存储桶的所有数据(例如一天)都需要放在一个分区中。您可以通过以某种方式对分区进行分片来解决此问题,例如在其中包含 uid 的某些方面。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-13
    相关资源
    最近更新 更多