【发布时间】:2021-12-01 02:49:41
【问题描述】:
我在 Cassandra 中有一个表格,它以文本格式存储 IP。 我想从该 Cassandra 表中删除其 IP 值为私有 IP 的行。
即位于以下范围内的 IP:
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
240.0.0.0 - 255.255.255.255
我正在使用正则表达式进行查询,但找不到合适的答案。我该怎么办?
【问题讨论】:
我在 Cassandra 中有一个表格,它以文本格式存储 IP。 我想从该 Cassandra 表中删除其 IP 值为私有 IP 的行。
即位于以下范围内的 IP:
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
240.0.0.0 - 255.255.255.255
我正在使用正则表达式进行查询,但找不到合适的答案。我该怎么办?
【问题讨论】:
首先,Cassandra 不允许通过正则表达式进行过滤。
由于 Cassandra 仅通过 PRIMARY KEY 组件存储和检索数据,因此如果不知道 PRIMARY KEY 结构是什么,这将很难回答。但是,我可以给你一个例子,这可能会有所帮助。
假设我有一个用于存储 IP 地址的简单表,在 IP 的前缀(在本例中为前两个八位字节)上有一个分区键,并在 IP 地址上聚集。这会产生如下 PK 结构:
PRIMARY KEY (prefix, ip)
这样就可以进行这样的范围查询:
SELECT ip FROM ips WHERE prefix='172.16'
AND ip >= '172.16.0.0'
AND ip < '172.16.0.4';
ip
------------
172.16.0.0
172.16.0.1
172.16.0.2
172.16.0.3
(4 rows)
同样,您也可以使用范围过滤器DELETE:
DELETE FROM ips WHERE prefix='172.16'
AND ip >= '172.16.0.0'
AND ip < '172.16.0.4';
当然,这只是因为我正在过滤我的 PRIMARY KEY 定义的组件。
但这个例子的重点是表明您确实可以对字符串/文本类型运行范围查询。 Cassandra 还为存储 IP 地址的特定目的提供了 INET 数据类型。
【讨论】:
您最好编写一个客户端代码来删除此类数据。编写逻辑来识别客户端要删除的键,并将删除查询一一发送到 Cassandra。
【讨论】: