Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cassandra-CQL3中的时间聚类_Cassandra_Timestamp_Cluster Analysis_Cql3 - Fatal编程技术网

Cassandra-CQL3中的时间聚类

Cassandra-CQL3中的时间聚类,cassandra,timestamp,cluster-analysis,cql3,Cassandra,Timestamp,Cluster Analysis,Cql3,我有一个关于宽行、集群、手动索引等的问题。。。我希望有人能在这里帮忙。CQL版本为3,Cassandra版本为2.0.1 比如说,我有CF‘产品’ id timeuuid location varchar shopname varchar expiry timestamp count int PRIMARY KEY (id) 我想能够选择产品在特定的地点订购到期。因此,创建类似以下内容的寄存器: CF 'id_register_by_l

我有一个关于宽行、集群、手动索引等的问题。。。我希望有人能在这里帮忙。CQL版本为3,Cassandra版本为2.0.1

比如说,我有CF‘产品’

    id timeuuid

    location varchar

    shopname varchar

    expiry timestamp

    count int

    PRIMARY KEY (id)
我想能够选择产品在特定的地点订购到期。因此,创建类似以下内容的寄存器:

CF 'id_register_by_loc_expy'

    location varchar

    expiry timestamp

    id timeuuid

    PRIMARY KEY (location,expiry,id)
并希望在到期日前订购的特定店名处选择产品。然后创建:

CF 'id_register_by_shopname_expy'

    shopname vachar

    expiry timestamp

    id timeuuid

    PRIMARY KEY (shopname,expiry,id)
这样我就可以按如下方式进行高效查询/切片:

1.从id_reg_中通过_loc_expy选择id,其中位置='x';//[到期自然订购]

2.通过位置='x'和到期时间>'t1'和到期时间<'t2'从id_reg_中选择id

3.从id为'id'的产品中选择*

4.从id_reg_by_shop_exp中选择id,其中shopname='y';//[到期自然订购]

5.按店铺计数从id_reg_中选择id,其中店铺名称='y'; //[按伯爵自然排序]

等等


如果集群键需要更改,并且我需要对寄存器中这些特定行上的条目重新排序,该怎么办

我的问题是:

  • 重新插入新的到期日(或计数)将导致新的主键,因此不会更新我的旧条目

  • 我无法“更新..设置到期='x2'其中…”,因为到期是主键的一部分

  • 由于逻辑删除限制,使用新主键插入然后删除旧主键是一个不好的选择


  • 我尝试过的是:

  • CF'id_reg_by_loc_expy'

    location varchar
    
    expiry timestamp
    
    id timeuuid
    
    otherSecondaryIndex varchar
    
    PRIMARY KEY (location,id)
    
  • 但是

    a。这并没有利用Cassandra的存储排序功能。我希望每一行都有许多产品,并且希望避免搜索整行产品;及

    b。事实证明,我实际上无法执行如下查询:

    (i) 从id\u reg\u中选择id。。。其中,dtg asc发出的“x”号订单

    错误请求:不支持具有第2个索引的ORDER BY

    Or
    
    (ii)从id_reg_中选择id。。。其中位置='x'和到期日>'t1'和到期日<'t2'

    错误的请求:使用Equal运算符的by columns子句中不存在索引列

    尽管我“能”做到这一点:

    (iii)从id\u reg\u中选择id。。。其中location='x'和otherSecIndex='y'和expire>'t1'和expire<'t2'

    **请注意,这需要我强制“允许筛选”,并且似乎设计得很糟糕,仅仅为了允许此查询而包含另一个辅助索引。。i、 e.不管怎样,我对“订单依据”查询不太感兴趣


    2.使用timeuuid代替到期时间戳。即使这起到了我找不到办法的作用,也无助于我的“按计数排序”意图

    我是不是错过了一些基本的东西?答案是我需要继续使用所有墓碑缓解技术吗?或者在我的应用程序中进行一些排序

    干杯,
    Tim

    如果排序列不是主键的一部分,则无法获得排序。Cassandra在查询时不进行排序

    您是否希望每个产品id多次更改过期戳记?如果不是,那么墓碑不应该是一个大问题,特别是如果你的行真的像你描述的那样小。您可以调整相关设置,如
    gc\u grace\u seconds
    (墓碑的悬挂时间)以确保它们符合您的操作需求和容量

    如果您计划非常频繁地更新过期时间,那么我的第一直觉是,如果不进行一些测量和手动调整以获得稳定的配置,这是一种很难处理的模式。如果你开始被墓碑淹没,你可能不得不求助于一个主要的压实计划来有效地移除堆积的墓碑

    底线是,任何具有类似队列语义的存储模式在Cassandra中以可伸缩的方式实现都是非常重要的。至少这是我的直觉