Azure Cosmos DB for Apache Cassandra 中的标记和标记函数

适用对象: Cassandra

本文介绍 Azure Cosmos DB for Apache Cassandra 中的标记和标记函数,并阐明本机 Cassandra 中标记的计算和用法差别。

什么是标记

标记是用于在群集中分发数据的哈希分区键。 在 Apache Cassandra 中分发数据时,将为每个节点分配一系列标记,你可以分配一个标记范围,也可以由 Cassandra 分配。 因此,在引入数据时,Cassandra 可以计算标记,并使用它来查找用于存储新引入的数据的节点。

什么是标记函数

标记函数是可以通过 Cassandra 群集的 CQL API 使用的函数。 它提供一种公开群集使用的分区函数的方式。 作为一个 CQL 函数,标记与其他大多数函数不同,因为它根据你要查询的表来限制传递给它的参数。 该函数允许的参数数目等于所要查询的表的分区键数目,参数的数据类型也限制为相应分区键的数据类型。

但请注意,对 Apache Cassandra 的这种限制是任意性的,并且仅应用于传递给该函数的常量值。 标记函数的最典型用法是使用它来对分区键的标记应用关系。 Azure Cosmos DB for Apache Cassandra 允许 SELECT 查询使用 WHERE 子句对数据的标记而不是数据本身进行筛选。

SELECT token(accountid) FROM uprofile.accounts;

system.token(accountid)
-------------------------
     2601062599670757427
     2976626013207263698

SELECT token(accountid) 
FROM uprofile.accounts 
WHERE token(accountid)=2976626013207263698;

 name  | accountid | state | country
-------+-----------+-------+-------+
 Devon |       405 | NYC   |  USA  |   

备注

在这种用法中,只能将分区键列指定为标记函数的参数。 在这种用法中,该函数只是一个占位符,让你可以直接基于分区哈希而不是分区键值创建筛选器。 这对于将扫描分解为多个子部分以及从表中并行读取数据非常有用。 此外,Azure Cosmos DB for Apache Cassandra 不允许对分区键进行范围查询。

标记在 Azure Cosmos DB for Apache Cassandra 中的工作原理

Azure Cosmos DB for Apache Cassandra 对本机 Cassandra 使用默认分区程序 Murmur3Partitioner。 它比其他分区程序的性能更高,并且哈希处理键的速度更快。 我们将使用同一个 Murmur3Partitioner 函数,同时做出一些变化,以确保在针对 Apache Cassandra 中默认 Murmur3Partitioner 运行的第三方工具的主机中实现交叉兼容性。

在 Cosmos DB 的 Cassandra API 中使用标记函数时存在一些限制:

  1. 标记函数只能用作分区键列的投影。 也就是说,它只能用于投影行的标记。
  2. 对于给定的分区键值,在 Cosmos DB 的 Cassandra API 上生成的标记值不同于在 Apache Cassandra 上生成的标记值。
  3. 标记函数 WHERE 子句的用法对于 Cosmos DB Cassandra 和 Apache Cassandra 是相同的。

备注

标记函数只能用于投影行的实际标记 (pk),或用于标记扫描(在 where 子句的 LHS 中使用)。

哪些方案不受 Cosmos DB Cassandra API 支持(但受 Apache Cassandra 支持)?

Azure Cosmos DB for Apache Cassandra 不支持以下方案:

  1. 将标记函数用作非分区键列的投影。
  2. 将标记函数用作常量值的投影。
  3. 在标记 where 子句的右侧使用标记函数。

后续步骤