在cassandra中通过计算更新列



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

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

所以这里的新列是一个int,它必须具有<主键%10>,这将给我新列的10个可能值,例如基于主键的最后一位的10页。主键被命名为idx,新列被称为idx_page

一个想法是添加新的"idx_page"列作为CLUSTERING列,但使用ALTERTABLE语句似乎不起作用。如果这是有效的,那么我可能在修改表格的cql声明中做错了什么。

我尝试的下一件事是添加新列,然后在该列上添加索引,因为最终客户端需要根据该列的值执行SELECT,以便获取在新列上具有特定值的所有行。这很好。

不管idx_page是集群列还是带有索引的普通列,仍有两个问题需要解决:

  1. 现有行具有NULL";值";在新列上(预期(
  2. 我必须找出最好的方法,当插入新行时,将为新列分配一个基于主键计算的值,最好不要手动更改所有客户端代码

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

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

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

我不知道如何进行这项工作,甚至不知道我是否走上了UDF/UDA的正确道路。

任何意见或建议请。

Alex

您可以构建一个自定义函数来实现这一点。

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;
';

最新更新