问题描述
我的表中有一个具有列表数据类型的列。我想使用 CQL 获取列表中的项目数 我试过了,但我无法找到正确的查询。有人可以帮我吗?
解决方法
因此在 Cassandra 中没有标准的方法来实现这一点。最简单的方法是从表中SELECT
列表并在应用程序端提取其项目的计数。
话虽如此,有一种方法可以通过构建用户定义函数 (UDF) 来实现这一点。首先,Cassandra 默认禁用 UDF,以防止集群用户执行恶意代码。如果您同意启用它们,您会在 cassandra.yaml
文件中找到该选项。这是一个简单的布尔值,因此您需要将其设置为 true
:
enable_user_defined_functions: true
当然,您必须停止/重新启动集群才能使此更改生效。
接下来,您可以创建一个 UDF 来返回一个表示列表大小的整数,如下所示:
CREATE OR REPLACE FUNCTION countlist (input List<text>)
RETURNS NULL ON NULL INPUT RETURNS int
LANGUAGE java AS 'return input.size();';
本质上,它的作用是将 List<text>
Cassandra 类型映射到 java.util.List<String>
Java 类型。从那里,它只需调用列表中的 size()
方法。
现在,我可以在 CQL 中使用 countlist
函数。假设我有一张桌子来跟踪父母的孩子:
CREATE TABLE kids (
parent text PRIMARY KEY,children list<text>);
对我来说,我可以这样查询:
SELECT parent,countlist(children) FROM kids WHERE parent='Aaron';
parent | stackoverflow.countlist(children)
--------+-----------------------------------
Aaron | 4
(1 rows)