在Cassandra中的CQL查询中,“PER PARTITION LIMIT”是什么意思?

5

我有一个 Scylla 表格如下所示:

cqlsh:sampleks> describe table test;

CREATE TABLE test (
    client_id int,
    when timestamp,
    process_ids list<int>,
    md text,
    PRIMARY KEY (client_id, when) ) WITH CLUSTERING ORDER BY (when DESC)
    AND bloom_filter_fp_chance = 0.01
    AND caching = {'keys': 'ALL', 'rows_per_partition': 'ALL'}
    AND comment = ''
    AND compaction = {'class': 'TimeWindowCompactionStrategy', 'compaction_window_size': '1', 'compaction_window_unit': 'DAYS'}
    AND compression = {'sstable_compression': 'org.apache.cassandra.io.compress.LZ4Compressor'}
    AND crc_check_chance = 1.0
    AND dclocal_read_repair_chance = 0.1
    AND default_time_to_live = 0
    AND gc_grace_seconds = 172800
    AND max_index_interval = 1024
    AND memtable_flush_period_in_ms = 0
    AND min_index_interval = 128
    AND read_repair_chance = 0.0
    AND speculative_retry = '99.0PERCENTILE';

我看到这是我们查询它的方式。我已经有很长时间没有使用cassandra了,所以这个PER PARTITION LIMIT对我来说是新的事物(看起来是最近添加的)。可以有人用通俗易懂的语言解释一下这是做什么的,并且给一些例子吗?我在网络上找不到任何好的文档来轻松地解释它。

SELECT * FROM test WHERE client_id IN ? PER PARTITION LIMIT 1;
1个回答

6

PER PARTITION LIMIT子句可在"宽分区场景"中发挥作用。它仅返回分区中的前两行。

考虑以下查询:

aploetz@cqlsh:stackoverflow> SELECT client_id,when,md 
        FROM test PER PARTITION LIMIT 2 ;

考虑到主键定义为(client_id,when),该查询将遍历每个client_id。卡桑德拉然后将仅从该分区返回前两行(由when聚集),而无论when的出现次数多少。
在此示例中,我向您的test表中插入了7行,使用了两个不同的client_id(总共2个分区)。 使用PER PARTITION LIMIT为2,我返回4行(2 client_id x PER PARTITION LIMIT 2)== 4行。
 client_id | when                            | md
-----------+---------------------------------+-----
         1 | 2020-05-06 12:00:00.000000+0000 | md1
         1 | 2020-05-05 22:00:00.000000+0000 | md1
         2 | 2020-05-06 19:00:00.000000+0000 | md2
         2 | 2020-05-06 01:00:00.000000+0000 | md2

(4 rows)

是的,PER PARTITION LIMIT 刚刚在 Scylla Open Source 3.1 中添加。您甚至可以在同一语句中混合使用常规 LIMIT 和 PER PARTITION LIMIT。更多信息请参见:https://docs.scylladb.com/getting-started/dml/#limiting-results对于 Scylla,这是问题#2202(https://github.com/scylladb/scylla/issues/2202),映射到 CASSANDRA-7017(https://issues.apache.org/jira/browse/CASSANDRA-7017) - Peter Corless
@Aaron,我在Cassandra模式设计方面有另一个问题在这里。我想知道你对我的问题有什么想法? - dragons
对于使用Spark的用户来说,.perPartitionLimit()是RDD选择一个分区中的1个唯一行的可行命令。 - ChiMo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接