如何在 cassandra db 中使用空集查询所有数据?
How can you query all the data with an empty set in cassandra db?
正如标题所说,我正在尝试查询我获得的所有数据,其中没有存储任何值。我已经搜索了一段时间,我发现唯一允许的操作是 CONTAINS
,这不符合我的需要。
考虑以下 table:
CREATE TABLE environment(
id uuid,
name varchar,
message text,
public Boolean,
participants set<varchar>,
PRIMARY KEY (id)
)
如何获得空集的 table 中的所有条目?例如。参与者 = {} 或 null?
不幸的是,你真的做不到。 Cassandra 在设计上让这样的查询变得困难,因为如果不进行完整的 table 扫描(扫描每个节点)就无法完成查询。这就是为什么 Cassandra 数据建模的很大一部分是了解 table 将被查询的所有方式,并构建它以支持这些查询。
您必须处理的另一个问题是(一般而言)Cassandra 不允许按 null
过滤。同样,这是一种设计选择……查询存在的数据比查询不存在的数据要容易得多。虽然,在使用 lightweight transactions 编写时,有一些方法可以解决这个问题(使用 IF
子句)。
如果您提前知道所有 id
,您可以编写一些内容来遍历它们,SELECT
并在应用程序端检查是否为 null。虽然这种方法会很慢(但不会对集群造成压力)。可能更好的方法是使用像 Apache Spark 这样的分布式 OLAP 层。它仍然不会很快,但这可能是处理这种情况的最佳方式。
正如标题所说,我正在尝试查询我获得的所有数据,其中没有存储任何值。我已经搜索了一段时间,我发现唯一允许的操作是 CONTAINS
,这不符合我的需要。
考虑以下 table:
CREATE TABLE environment(
id uuid,
name varchar,
message text,
public Boolean,
participants set<varchar>,
PRIMARY KEY (id)
)
如何获得空集的 table 中的所有条目?例如。参与者 = {} 或 null?
不幸的是,你真的做不到。 Cassandra 在设计上让这样的查询变得困难,因为如果不进行完整的 table 扫描(扫描每个节点)就无法完成查询。这就是为什么 Cassandra 数据建模的很大一部分是了解 table 将被查询的所有方式,并构建它以支持这些查询。
您必须处理的另一个问题是(一般而言)Cassandra 不允许按 null
过滤。同样,这是一种设计选择……查询存在的数据比查询不存在的数据要容易得多。虽然,在使用 lightweight transactions 编写时,有一些方法可以解决这个问题(使用 IF
子句)。
如果您提前知道所有 id
,您可以编写一些内容来遍历它们,SELECT
并在应用程序端检查是否为 null。虽然这种方法会很慢(但不会对集群造成压力)。可能更好的方法是使用像 Apache Spark 这样的分布式 OLAP 层。它仍然不会很快,但这可能是处理这种情况的最佳方式。