关系数据库和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,有没有办法做到这一点?
谢谢你的帮助,如果太明显了,我很抱歉。
1条答案
按热度按时间cuxqih211#
原因
出现此错误是因为您的查询没有针对主键列的筛选器:
行程日期和行程时间都不是表的主键列,因此无法使用这些列进行查询。
警告
ALLOW FILTERING
子句通过执行全表扫描、查询所有节点上的每个分区来启用对非主键列的过滤,因此开销非常大且不可预测。建议仅在查询限于单个分区时使用
ALLOW FILTERING
子句。变通方案
为了查询非主键列,您需要索引这些列。为了举例说明,下面是我的表,它将trip
id
作为主键:如果我想使用
tripdate
或triptime
运行查询,我需要使用以下内容对这些列进行索引:现在我已经为它们建立了索引,我可以执行如下查询:
警告:要知道索引有它自己的问题,所以要知道优点和缺点。详细信息请参阅When to use and not use an index。
溶液
Cassandra是为高吞吐量、高速在线事务(OLTP)用例而设计的,在这些用例中,您一次检索一个分区的数据(按分区键过滤查询)。
相比之下,您的查询本质上是分析(OLAP),因为您不是只读取一个分区--而是扫描整个表。因此,运行分析查询的最佳方法是将Apache Spark与Spark Cassandra connector配合使用。
👉 请将鼠标悬停在cassandra标签上,然后单击
Watch tag
按钮,以支持Apache Cassandra社区。谢谢!🙏 Thanks!