Select 具有最高时间戳的行
Select row with highest timestamp
我有一个 table 存储事件
CREATE TABLE active_events (
event_id VARCHAR,
number VARCHAR,
....
start_time TIMESTAMP,
PRIMARY KEY (event_id, number)
);
现在,我想要 select 最高 start_time
的事件。有可能的?我尝试创建二级索引,但没有成功。
这是我创建的查询
select * from active_call order by start_time limit 1
但错误显示 ORDER BY is only supported when the partition key is restricted by an EQ or an IN
。
我应该创建某种物化视图吗?我应该怎么做才能执行我的查询?
这是 Cassandra 中的 anti-pattern。要订购数据,您需要读取所有数据并找到最高值。并且需要扫描多个节点的数据,时间会很长。
物化视图也无济于事,因为数据的顺序仅存在于单个分区内,因此您需要将所有数据放入一个分区中,该分区可能很大且数据会不平衡。
我只能想到以下解决方法:
有一个额外的 table,它将包含原始 table 的所有列,但带有假分区键且没有集群列
您确实在 table 中插入了与正常插入并行的内容,但是为该假分区键使用了固定值,并明确设置 a timestamp for a record 等于 start_time
(不要忘记乘以 1000,因为时间戳使用微秒)。在这种情况下,它将保证是具有最高时间戳的值,因为 Cassandra 不会用具有较低时间戳的其他数据覆盖它。
但这并没有解决数据倾斜的问题,所有流量都将由等于 RF 的固定数量的节点处理。
另一个选择 - 使用另一个数据库。
这种类型的查询在大数据中无效,因为它需要完整的 table 扫描并且无法扩展。它适用于传统的关系数据库,因为数据集较小。想象一下,您有数十亿个分区,每个分区都有数千行分布在数百个节点上。如果允许的话,大型集群中的完整 table 扫描将花费很长时间。
错误:
ORDER BY is only supported when the partition key is restricted by an EQ or an IN
返回是因为您只能对结果进行排序,前提是 (a) 查询仅限于分区键,并且 (b) 行按集群列排序。您不能根据不属于聚簇键的列对结果进行排序。干杯!
我有一个 table 存储事件
CREATE TABLE active_events (
event_id VARCHAR,
number VARCHAR,
....
start_time TIMESTAMP,
PRIMARY KEY (event_id, number)
);
现在,我想要 select 最高 start_time
的事件。有可能的?我尝试创建二级索引,但没有成功。
这是我创建的查询
select * from active_call order by start_time limit 1
但错误显示 ORDER BY is only supported when the partition key is restricted by an EQ or an IN
。
我应该创建某种物化视图吗?我应该怎么做才能执行我的查询?
这是 Cassandra 中的 anti-pattern。要订购数据,您需要读取所有数据并找到最高值。并且需要扫描多个节点的数据,时间会很长。
物化视图也无济于事,因为数据的顺序仅存在于单个分区内,因此您需要将所有数据放入一个分区中,该分区可能很大且数据会不平衡。
我只能想到以下解决方法:
有一个额外的 table,它将包含原始 table 的所有列,但带有假分区键且没有集群列
您确实在 table 中插入了与正常插入并行的内容,但是为该假分区键使用了固定值,并明确设置 a timestamp for a record 等于
start_time
(不要忘记乘以 1000,因为时间戳使用微秒)。在这种情况下,它将保证是具有最高时间戳的值,因为 Cassandra 不会用具有较低时间戳的其他数据覆盖它。
但这并没有解决数据倾斜的问题,所有流量都将由等于 RF 的固定数量的节点处理。
另一个选择 - 使用另一个数据库。
这种类型的查询在大数据中无效,因为它需要完整的 table 扫描并且无法扩展。它适用于传统的关系数据库,因为数据集较小。想象一下,您有数十亿个分区,每个分区都有数千行分布在数百个节点上。如果允许的话,大型集群中的完整 table 扫描将花费很长时间。
错误:
ORDER BY is only supported when the partition key is restricted by an EQ or an IN
返回是因为您只能对结果进行排序,前提是 (a) 查询仅限于分区键,并且 (b) 行按集群列排序。您不能根据不属于聚簇键的列对结果进行排序。干杯!