Cassandra CQL - 将 system.local table 中的 release_version 列转换为 int
Cassandra CQL - Convert the release_version column in system.local table to an int
我正在用 cql 编写一个查询,检查 Cassandra 的发行版本是否大于或等于 3.11.10。
select * from system.local where release_version >= '3.11.10'
由于 release_version 是文本数据类型,这将不起作用,我无法找到获取此值的子字符串或将值转换为 int 的方法。
我无法为此创建函数,因为我无法在系统表上创建函数。
我也无法使用 Java/Python 等它必须在 cql 中完成。
我也尝试过在 where 语句中使用 in 子句,但我似乎无法在不出错的情况下在 in 中输入多个值:
IN predicates on non-primary-key columns (release_version) is not yet supported
有人知道解决这个问题的方法或解决方法吗?
不幸的是,没有办法在 CQL 中本地执行此操作。
如果您不能执行代码,那么至少您必须在 shell 脚本中执行。干杯!
因此,如果您添加 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'
.
之类的比较
As the release_version is data type text this will not work and I cannot find a way to get a substring of this value or get a way to cast the value to an int.
这里的数据类型不是问题。这里的比较(在字符串上)显然是“ASCII-betical”,而不是 alpha[betical|numeric]。但是排序顺序在 table 上应该无关紧要,它只会有一行。
编辑
unable to create a function for this as I cannot create a function on system tables.
正确的说法。但是您可以在另一个键空间中创建一个函数,然后在系统tables.
上使用它
if I execute the select on a version lower than 3.11.10 (eg If i run the same select on 3.11.8 i am getting a result)
知道了。要解决这个问题,您可以构建一个函数。我能够让它工作,但它有点“hacky”。所以我创建了一个名为 concat311
的新用户定义函数,它接受一个整数并将其添加为字符串“3.11.”
的补丁级版本
CREATE OR REPLACE FUNCTION Whosebug.concat311 (input INT)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return "3.11." + String.format("%02d", input);';
本质上,returns 补丁级版本号为“零填充”,因此可以成功与 release_version
列值进行比较。
> SELECT cluster_name, release_version, Whosebug.concat311(7) FROM system.local
WHERE release_version > Whosebug.concat311(7) ALLOW FILTERING;
cluster_name | release_version | Whosebug.concat311(7)
------------------------+-----------------+----------------------------
Aarons 3.11.10 Cluster | 3.11.10 | 3.11.07
(1 rows)
这里的缺点是,这不适用于等式约束 ("3.11.8" != "3.11.08")。但它适用于 [greater|less]-than 比较。
我正在用 cql 编写一个查询,检查 Cassandra 的发行版本是否大于或等于 3.11.10。
select * from system.local where release_version >= '3.11.10'
由于 release_version 是文本数据类型,这将不起作用,我无法找到获取此值的子字符串或将值转换为 int 的方法。
我无法为此创建函数,因为我无法在系统表上创建函数。 我也无法使用 Java/Python 等它必须在 cql 中完成。
我也尝试过在 where 语句中使用 in 子句,但我似乎无法在不出错的情况下在 in 中输入多个值:
IN predicates on non-primary-key columns (release_version) is not yet supported
有人知道解决这个问题的方法或解决方法吗?
不幸的是,没有办法在 CQL 中本地执行此操作。
如果您不能执行代码,那么至少您必须在 shell 脚本中执行。干杯!
因此,如果您添加 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'
.
As the release_version is data type text this will not work and I cannot find a way to get a substring of this value or get a way to cast the value to an int.
这里的数据类型不是问题。这里的比较(在字符串上)显然是“ASCII-betical”,而不是 alpha[betical|numeric]。但是排序顺序在 table 上应该无关紧要,它只会有一行。
编辑
unable to create a function for this as I cannot create a function on system tables.
正确的说法。但是您可以在另一个键空间中创建一个函数,然后在系统tables.
上使用它if I execute the select on a version lower than 3.11.10 (eg If i run the same select on 3.11.8 i am getting a result)
知道了。要解决这个问题,您可以构建一个函数。我能够让它工作,但它有点“hacky”。所以我创建了一个名为 concat311
的新用户定义函数,它接受一个整数并将其添加为字符串“3.11.”
CREATE OR REPLACE FUNCTION Whosebug.concat311 (input INT)
RETURNS NULL ON NULL INPUT RETURNS TEXT
LANGUAGE java AS 'return "3.11." + String.format("%02d", input);';
本质上,returns 补丁级版本号为“零填充”,因此可以成功与 release_version
列值进行比较。
> SELECT cluster_name, release_version, Whosebug.concat311(7) FROM system.local
WHERE release_version > Whosebug.concat311(7) ALLOW FILTERING;
cluster_name | release_version | Whosebug.concat311(7)
------------------------+-----------------+----------------------------
Aarons 3.11.10 Cluster | 3.11.10 | 3.11.07
(1 rows)
这里的缺点是,这不适用于等式约束 ("3.11.8" != "3.11.08")。但它适用于 [greater|less]-than 比较。