【发布时间】:2021-07-12 02:55:18
【问题描述】:
我的表中有一个具有列表数据类型的列。我想使用 CQL 获取列表中的项目数 我试过了,但找不到正确的查询。谁能帮帮我?
【问题讨论】:
标签: database cassandra nosql cql cqlsh
我的表中有一个具有列表数据类型的列。我想使用 CQL 获取列表中的项目数 我试过了,但找不到正确的查询。谁能帮帮我?
【问题讨论】:
标签: database cassandra nosql cql cqlsh
所以在 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() 方法。
现在,我可以将 countlist 函数与 CQL 一起使用。所以假设我有一张表来跟踪父母的孩子:
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)
【讨论】: