CQL 查询以获取 CassandraDB 的 LIST DATATYPE 中的元素计数?

问题描述

我的表中有一个具有列表数据类型的列。我想使用 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)