如何在Cassandra中基于非主键过滤器计算非重复值?

yc0p9oo0  于 2023-01-20  发布在  Cassandra
关注(0)|答案(1)|浏览(123)

关系数据库和Cassandra。具有如下两个表:
表1:主键(ID、日期));
| 识别号|日期|跳闸时间|
| - ------|- ------|- ------|
| 编号B03291|2022年1月1日|五个|
| 编号B03291|2022年1月2日|六个|
| ZR7875|2022年1月1日|第二章|
| ZR7875|2022年1月2日|无|
表2:主键((ID、类型)、日期))
| 类型|识别号|日期|跳闸时间|
| - ------|- ------|- ------|- ------|
| A类|编号B03291|2022年1月1日|五个|
| A类|编号B03291|2022年1月2日|六个|
| 乙|ZR7875|2022年1月1日|第二章|
| 乙|ZR7875|2022年1月2日|无|
| A类|GF4589|2022年1月1日|七|
这两个表具有相同的数据,但聚合方式不同。
使用更适合这个查询的表,我需要获得在DATE ='2022 - 01 - 01' trip_time大于0的所有ID的COUNT,但是我不能使用allow过滤或创建另一个表。
我一直在使用查询:

SELECT COUNT(ID)
FROM table1
WHERE date = '2022-01-01'
AND trip_time > 0;

但是它引发了一个错误,并要求我允许过滤,如果我不能指定一个ID,因为我想要所有的COUNT,有没有办法做到这一点?
谢谢你的帮助,如果太明显了,我很抱歉。

cuxqih21

cuxqih211#

原因

出现此错误是因为您的查询没有针对主键列的筛选器:

InvalidRequest: Error from server: code=2200 [Invalid query] \
  message="Cannot execute this query as it might involve data filtering and thus may have \
  unpredictable performance. If you want to execute this query despite the performance \
  unpredictability, use ALLOW FILTERING"

行程日期和行程时间都不是表的主键列,因此无法使用这些列进行查询。

警告

ALLOW FILTERING子句通过执行全表扫描、查询所有节点上的每个分区来启用对非主键列的过滤,因此开销非常大且不可预测。
建议仅在查询限于单个分区时使用ALLOW FILTERING子句。

变通方案

为了查询非主键列,您需要索引这些列。为了举例说明,下面是我的表,它将trip id作为主键:

CREATE TABLE stackoverflow.trips_by_id (
    id text PRIMARY KEY,
    tripdate date,
    triptime int
)

如果我想使用tripdatetriptime运行查询,我需要使用以下内容对这些列进行索引:

CREATE CUSTOM INDEX tripdate_idx ON stackoverflow.trips_by_id (tripdate);
CREATE CUSTOM INDEX triptime_idx ON stackoverflow.trips_by_id (triptime);

现在我已经为它们建立了索引,我可以执行如下查询:

SELECT ... FROM trips_by_id
  WHERE tripdate = ?
  AND triptime = ?

警告:要知道索引有它自己的问题,所以要知道优点和缺点。详细信息请参阅When to use and not use an index

溶液

Cassandra是为高吞吐量、高速在线事务(OLTP)用例而设计的,在这些用例中,您一次检索一个分区的数据(按分区键过滤查询)。
相比之下,您的查询本质上是分析(OLAP),因为您不是只读取一个分区--而是扫描整个表。因此,运行分析查询的最佳方法是将Apache Spark与Spark Cassandra connector配合使用。
👉 请将鼠标悬停在cassandra标签上,然后单击Watch tag按钮,以支持Apache Cassandra社区。谢谢!🙏 Thanks!

相关问题