所有聚类列的总和太长 (65927 > 65535)

Posted

技术标签:

【中文标题】所有聚类列的总和太长 (65927 > 65535)【英文标题】:The sum of all clustering columns is too long (65927 > 65535) 【发布时间】:2015-01-13 10:47:34 【问题描述】:

在插入 Cassandra db 时出现此错误,我正在向数据库中插入非常大的数据,此错误是因为内存,我有足够的磁盘空间,因为我知道数据库中的行可以容纳 20 亿条记录,所以我我缺少列范围配置。

Exception in thread "main" com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (65927 > 65535)
        at com.datastax.driver.core.exceptions.InvalidQueryException.copy(InvalidQueryException.java:35)
        at com.datastax.driver.core.DefaultResultSetFuture.extractCauseFromExecutionException(DefaultResultSetFuture.java:259)
        at com.datastax.driver.core.DefaultResultSetFuture.getUninterruptibly(DefaultResultSetFuture.java:175)
        at com.datastax.driver.core.AbstractSession.execute(AbstractSession.java:52)
        at FileLogger.persistData(FileLogger.java:91)
        at FileLogger.main(FileLogger.java:59)
Caused by: com.datastax.driver.core.exceptions.InvalidQueryException: The sum of all clustering columns is too long (65927 > 65535)

【问题讨论】:

该错误表明您有太多的“集群列”,这很可能是软件的内置限制(因为限制是整数 2^16-1)而不是硬件。 【参考方案1】:

看起来很清楚,您汇总的列名大于预期的 cassandra 似乎是 (0XFFFF = 65535)。

要么你可以减少名字,要么你必须划分你的查询。

发件人:Link

105     public static void validateColumnNames(Iterable<ByteBuffer> columnNames) throws InvalidRequestException
106     
107         for (ByteBuffer name : columnNames)
108             validateColumnName(name);
109     
110
111     public static void validateColumnName(ByteBuffer name) throws InvalidRequestException
112     
113         if (name.remaining() > IColumn.MAX_NAME_LENGTH)
114             throw new InvalidRequestException(String.format("The sum of all clustering columns is too long (%s > %s)",
115                                                             name.remaining(),
116                                                             IColumn.MAX_NAME_LENGTH));
117
118         if (name.remaining() == 0)
119             throw new InvalidRequestException("Invalid empty value for clustering column of COMPACT TABLE");
120     

【讨论】:

感谢 Michael 的回复 :),我的复合键是 ((timestamp_byhour),timestamp,payload)。我认为这里的列名长度并不重要。但是一旦我从复合中删除有效负载,它肯定会解决密钥是具有 2048 个字符的文本类型。仍然不清楚为什么在插入 70000 条记录后它失败了,它是一个单集群和单节点服务器。如果集群列的总和太长,那么集群键中可以考虑多少列。即使我将有效负载的文本类型更改为 blob,仍然会出现同样的错误。如果有人能解释什么是“所有聚类列的总和”,那就太好了

以上是关于所有聚类列的总和太长 (65927 > 65535)的主要内容,如果未能解决你的问题,请参考以下文章

在 BigQuery python api 中设置聚类列

在BigQuery python api中设置聚类列

不能限制聚类列“状态”(前面的列“日期时间”受非 EQ 关系限制

使用 IF NOT EXISTS 使用主键和聚类列进行唯一插入

如何计算 2D numpy 数组的所有列的总和(有效)

LINQ 将列的总和添加到列表条目