【问题标题】:Cassandra CQL - Convert the release_version column in system.local table to an intCassandra CQL - 将 system.local 表中的 release_version 列转换为 int
【发布时间】:2023-04-01 17:30:01
【问题描述】:

我正在用 cql 编写一个查询,检查 Cassandra 的发布版本是否大于或等于 3.11.10。

select * from system.local where release_version >= '3.11.10'

由于 release_version 是数据类型文本,这将不起作用,我找不到获取此值的子字符串或将值转换为 int 的方法。

我无法为此创建函数,因为我无法在系统表上创建函数。 我也无法使用 Java/Python 等,它必须在 cql 中完成。

我也尝试过 where 语句中的 in 子句,但我似乎无法在 in 中输入多个值而不会出错:

尚不支持非主键列 (release_version) 上的 IN 谓词

有没有人知道如何执行此操作的方法或解决方法?

【问题讨论】:

    标签: cassandra cql cqlsh


    【解决方案1】:

    不幸的是,没有办法在 CQL 中本地执行此操作。

    如果您不能执行代码,那么至少您必须在 shell 脚本中执行。干杯!

    【讨论】:

      【解决方案2】:

      因此,如果您添加 ALLOW FILTERING 指令,则原始查询可以工作:

      > SELECT cluster_name, release_version FROM system.local
        WHERE release_version >= '3.11.10' ALLOW FILTERING;
      
       cluster_name           | release_version
      ------------------------+-----------------
       Aarons 3.11.10 Cluster |         3.11.10
      
      (1 rows)
      

      通常我不会建议ALLOW FILTERING,但system 键空间使用LocalStrategy,因此查询只会转到单个节点。这也适用于 >= '3.0'>= '3.11' 甚至 < '4.0' 之类的比较。

      由于 release_version 是数据类型文本,这将不起作用,我找不到获取此值的子字符串或将值转换为 int 的方法。

      这里的数据类型不是一个显眼的东西。这里的比较(在字符串上)显然是“ASCII-betical”,而不是 alpha[betical|numeric]。但是对于只有一行的表来说,排序顺序并不重要。

      编辑

      无法为此创建函数,因为我无法在系统表上创建函数。

      真实的陈述。但是您可以在另一个键空间中创建一个函数,然后在系统表上使用它。

      如果我在低于 3.11.10 的版本上执行选择(例如,如果我在 3.11.8 上运行相同的选择,我会得到结果)

      知道了。为了解决这个问题,您可以构建一个函数。我能够让它工作,但它有点“hacky”。所以我创建了一个名为concat311 的新用户定义函数,它接受一个整数并将其添加为字符串“3.11”的补丁级版本。

      CREATE OR REPLACE FUNCTION *.concat311 (input INT)
      RETURNS NULL ON NULL INPUT RETURNS TEXT
      LANGUAGE java AS 'return "3.11." + String.format("%02d", input);';
      

      本质上,它将补丁级版本号返回为“零填充”,因此可以成功地将其与 release_version 列值进行比较。

      > SELECT cluster_name, release_version, *.concat311(7) FROM system.local
        WHERE release_version > *.concat311(7) ALLOW FILTERING;
      
       cluster_name           | release_version | *.concat311(7)
      ------------------------+-----------------+----------------------------
       Aarons 3.11.10 Cluster |         3.11.10 |                    3.11.07
      
      (1 rows)
      

      这里的缺点是这不适用于等式约束(“3.11.8”!=“3.11.08”)。但它适用于 [大于|小于] 的比较。

      【讨论】:

      • 嗨亚伦,我之前尝试过允许过滤,但结果相同。我面临的问题是,如果我在低于 3.11.10 的版本上执行选择,where 子句中的大于等于会给我一个不正确的结果(例如,如果我在 3.11.8 上运行相同的选择,我会得到结果)
      • @OliviaCronin 对。因为通过字符串比较,8 大于.10 中的1。让我考虑一下。
      • @OliviaCronin 进行了编辑。 TBH 不过,Erick 关于使用脚本的建议可能是一个更简洁的解决方案。
      • 我知道可以创建函数,但不幸的是这不是一个选项。脚本可能是最好的。
      最近更新 更多