在 Cassandra 中查询,将按特定字段对整个 table 进行排序
Query in Cassandra that will sort the whole table by a specific field
我有一个table这样的
CREATE TABLE my_table(
category text,
name text,
PRIMARY KEY((category), name)
) WITH CLUSTERING ORDER BY (name ASC);
我想编写一个查询,在整个 table 中按名称排序,而不仅仅是每个分区。
这可能吗?编写该查询的 "Cassandra way" 是什么?
我在 Whosebug 网站上阅读了其他答案,一些示例创建了具有一个 ID(桶)的单个分区,这是主键,但我不想要那样,因为我想让我的数据分布在节点上按类别
Cassandra 不支持跨分区排序;只支持分区内排序
所以您可以做的是分别查询每个类别,它会 return 每个分区的排序名称。然后你可以在你的客户端中合并这些排序结果(这比完整排序快得多)。
另一种方法是使用 Spark 将 table 读入 RDD 并在 Spark 中对其进行排序。
始终通过访问模式对 cassandra table 进行建模(关系数据库/cassandra 满足不同的需求)。
直到 Cassandra 2.X,必须为每个访问模式建模新的列族 (tables)。因此,如果您的访问模式需要对特定列进行排序,则在 partition/clustering 键中使用该列对 table 进行建模。因此,代码必须同时插入 mastertable 和投影 table。 请注意,根据您的业务逻辑,如果存在并发更新,这可能很难同步,特别是如果有更新要在 读取投影后执行。
有了 Cassandra 3.x,现在有物化视图,这将使您拥有类似的功能,但将由 Cassandra 内部处理。不确定它是否适合您的问题,因为我没有玩太多 3.X 但这可能值得研究。
更多关于他们 blog 的物化视图。
我有一个table这样的
CREATE TABLE my_table(
category text,
name text,
PRIMARY KEY((category), name)
) WITH CLUSTERING ORDER BY (name ASC);
我想编写一个查询,在整个 table 中按名称排序,而不仅仅是每个分区。
这可能吗?编写该查询的 "Cassandra way" 是什么?
我在 Whosebug 网站上阅读了其他答案,一些示例创建了具有一个 ID(桶)的单个分区,这是主键,但我不想要那样,因为我想让我的数据分布在节点上按类别
Cassandra 不支持跨分区排序;只支持分区内排序
所以您可以做的是分别查询每个类别,它会 return 每个分区的排序名称。然后你可以在你的客户端中合并这些排序结果(这比完整排序快得多)。
另一种方法是使用 Spark 将 table 读入 RDD 并在 Spark 中对其进行排序。
始终通过访问模式对 cassandra table 进行建模(关系数据库/cassandra 满足不同的需求)。
直到 Cassandra 2.X,必须为每个访问模式建模新的列族 (tables)。因此,如果您的访问模式需要对特定列进行排序,则在 partition/clustering 键中使用该列对 table 进行建模。因此,代码必须同时插入 mastertable 和投影 table。 请注意,根据您的业务逻辑,如果存在并发更新,这可能很难同步,特别是如果有更新要在 读取投影后执行。
有了 Cassandra 3.x,现在有物化视图,这将使您拥有类似的功能,但将由 Cassandra 内部处理。不确定它是否适合您的问题,因为我没有玩太多 3.X 但这可能值得研究。
更多关于他们 blog 的物化视图。