获取值在 2 列之间的行
Posted
技术标签:
【中文标题】获取值在 2 列之间的行【英文标题】:Getting a row whos value is between 2 columns 【发布时间】:2014-05-09 15:33:34 【问题描述】:问题:
本质上,我想在 Cassandra 中执行 SELECT LocID FROM GEOIPMAP 其中 20 BETWEEN RangeStart AND RangeEnd。
-
这可能吗?
有更好的解决方案吗?
背景:
我们正在努力为我们拥有的一个非常大的表找到一个快速的大数据解决方案。我们正在考虑迁移到 Cassandra,但我想知道是否可以快速/合理地获得介于两个 bin 之间的值(或更好的解决方案,请提出建议)
我们有一个 ip 范围(int64)列表,可以连接到 sql 中的另一个表。该表本质上是:
+------------+----------+-------+
| RangeStart | RangeEnd | LocID |
+------------+----------+-------+
| 0 | 5000 | 2 |
+------------+----------+-------+
【问题讨论】:
一些有关您的域限制的更多信息会有所帮助。对于给定的 ip,它可能在多个范围内,还是范围不重叠并且 IP 和范围之间存在多对一映射? @TupshinHarper 范围开始和范围结束都是唯一的,并且永远不会重叠,也不应该有死区。位置 id 的范围是一对多...范围只有一个 locID,但可以在许多不同的范围中找到一个 LocID。范围末端的最大值略高于 40 亿。 【参考方案1】:如果您的范围不重叠,您可以在分区内执行此操作。
CREATE TABLE locs (
bucket INT,
rangeend INT,
locid INT,
PRIMARY KEY (bucket, rangeend));
您将需要使用某种分区键(存储桶)将事物拆分为多个分区,否则您只会在拥有该行的节点上创建热点。
然后你可以:
SELECT locid FROM locs WHERE bucket = 0 AND rangeend > 20 LIMIT 1;
将为您提供分区 0 中范围结束 > 20 的第一行的 locid。
【讨论】:
以上是关于获取值在 2 列之间的行的主要内容,如果未能解决你的问题,请参考以下文章