CQL列表值是否真的限制为65535字节?

Sot*_*lis -6 cql cassandra

文档列出了Cassandra 2.2的许多CQL限制.我在为收集限制特别感兴趣SetList.如果我已正确解释它,该文档指出集合中的值限制为65535字节.

据我所知,这个限制是存在的,因为set identity是使用存储引擎单元的列名中的复合值实现的(类似于聚类列值限制),CQL限制为那么多字节.

考虑一个Set类似的表

CREATE TABLE test.bounds (
    someid text,
    someorder text,
    words set<text>,
    PRIMARY KEY (someid, someorder)
)
Run Code Online (Sandbox Code Playgroud)

PreparedStatement ps = session.prepare("INSERT INTO test.bounds (someid, someorder, words) VALUES (?, ?, ?)");
BoundStatement bs = ps.bind("id", "order", ImmutableSet.of(StringUtils.repeat('a', 66000)));
session.execute(bs);
Run Code Online (Sandbox Code Playgroud)

这将抛出预期的异常

Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (66024 > 65535)
Run Code Online (Sandbox Code Playgroud)

现在如果我改变表使用a List而不是aSet

CREATE TABLE test.bounds (
    someid text,
    someorder text,
    words list<text>,
    PRIMARY KEY (someid, someorder)
)
Run Code Online (Sandbox Code Playgroud)

并使用

BoundStatement bs = ps.bind("id", "order", ImmutableList.of(StringUtils.repeat('a', 66000)));
Run Code Online (Sandbox Code Playgroud)

我没有收到例外.但是,该文档指出,List值大小也限制为65535字节.文件是不正确还是我误解了?

我假设List值在底层存储中实现为简单列值,并且通过其时间戳维护订单.

And*_*ert 6

据我所知,这里的文档是错误的.协议版本3(在C*2.1中引入)中更改了该限制.从协议3的更改部分下的本机协议规范:

  • 集合的序列化格式已更改(集合大小和每个参数的长度现在都是4个字节长).见第6节.

因此,只要使用协议版本3或更高版本,就可以创建多达2 ^ 31-1个字节(2147483647)或元素的列表.

编辑:我刚刚注意到你对集合身份的评论,这可能是存储引擎本身的限制,所以也许文档因此而保留了这种方式,但协议本身现在支持更大的集合.将继续观察我们是否可以记录这种细微差别.