【问题标题】:Updating column by calculation in cassandra在 cassandra 中通过计算更新列
【发布时间】:2020-03-12 07:02:28
【问题描述】:

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

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

所以这里的新列是一个int,它必须有的值,这会给我新列的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 走在正确的道路上。

请提供任何 cmet 或建议。

亚历克斯

【问题讨论】:

  • 我尝试进行更新操作,例如:update table1 set idx_page = (idx %10); 它失败了,显然目前这种方式只支持 + 和 -,不支持其他运算符,包括 %(模数) .

标签: cassandra user-defined-functions user-defined-aggregate


【解决方案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;
     ';

【讨论】:

  • 嗨,GAK,谢谢。这就解决了内联不直接支持取模的部分。但原问题中描述的 2 个问题仍未解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-21
  • 2014-10-30
  • 1970-01-01
相关资源
最近更新 更多