我正试图在cassandra表中添加一个新列,以帮助进行一些客户端操作。表已经存在,并且其中包含数据。主键是bigint。
其想法是在表上添加一列,该列将创建主键的域。
所以这里的新列是一个int,它必须具有<主键%10>,这将给我新列的10个可能值,例如基于主键的最后一位的10页。主键被命名为idx
,新列被称为idx_page
。
一个想法是添加新的"idx_page"列作为CLUSTERING列,但使用ALTERTABLE语句似乎不起作用。如果这是有效的,那么我可能在修改表格的cql声明中做错了什么。
我尝试的下一件事是添加新列,然后在该列上添加索引,因为最终客户端需要根据该列的值执行SELECT,以便获取在新列上具有特定值的所有行。这很好。
不管idx_page
是集群列还是带有索引的普通列,仍有两个问题需要解决:
- 现有行具有NULL";值";在新列上(预期(
- 我必须找出最好的方法,当插入新行时,将为新列分配一个基于主键计算的值,最好不要手动更改所有客户端代码
我想我可以通过使用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;
';