0

我正在尝试在 cassandra 表中添加一个新列以帮助进行一些客户端操作。该表已经存在,并且其中包含数据。主键是 bigint。

这个想法是在表上添加一个列,该列将创建主键的域。

所以这里的新列是一个int,它必须有<primary-key % 10>的值,这会给我新列的10个可能的值,比如基于主键最后一位的10页。主键被命名idx,新列被调用idx_page

一个想法是将新的 'idx_page' 列添加为 CLUSTERING 列,但这似乎不起作用,使用 ALTER TABLE 语句。如果这应该起作用,那么我可能对我的 cql 语句做错了改变表。

接下来我尝试添加新列,然后在其上添加索引,因为最终客户端将需要根据该列的值执行 SELECT 以获取在新列上具有特定值的所有行。这工作得很好。

无论是idx_page聚簇列还是带有索引的普通列,仍有两个问题需要解决:

  1. 现有行在新列上有一个 NULL“值”(这是预期的)
  2. 我必须找出最好的方法,即当插入新行时,将为新列分配一个基于主键计算的值,最好不要通过更改所有客户端代码来手动执行此操作。

我想我可以通过使用 cassandra FUNCTIONS 和 AGGREGATES 来解决这两个问题?

理想情况下,我希望能够手动调用某个函数一次,以更新所有现有行,并为 分配一个值idx_page,该值始终由 (idx % 10) 计算。

然后在插入时,我希望自动运行相同的逻辑,以便 idx_page 在插入阶段获得一个值。

我不确定如何进行此操作,或者即使我使用 UDF/UDA 走在正确的道路上。

请有任何意见或建议。

亚历克斯

4

1 回答 1

1

您可以构建一个自定义函数来完成此操作。

https://docs.datastax.com/en/cql/3.3/cql/cql_using/useCreateUDF.html

CREATE FUNCTION IF NOT EXISTS moduluo (input bigint) 
   CALLED ON NULL INPUT 
   RETURNS int 
   LANGUAGE java AS '
     return input % 10;
     ';
于 2019-11-17T05:18:00.880 回答