Cassandra MAX函数返回不匹配行问题求助
Cassandra聚合查询结果不符问题排查与解决
问题原因
你的查询未限定coauthor_name字段,MAX(num_of_colab)会计算pid='40/2499'且year=2020范围内所有合著者的num_of_colab全局最大值。而Cassandra在聚合查询中包含非聚合列(此处为coauthor_name)时,会返回结果集中任意一行的该列值,并非与最大值对应,这就导致你看到数值9(其他合著者的)错误关联到了Abdul的名字上。
解决方案
1. 查询特定合著者的合著数
若要获取Abdul Hanif Bin Zaini在2020年的合著数,无需使用聚合函数,直接精准过滤即可:
select coauthor_name, num_of_colab from coauthor_by_author where pid = '40/2499' and year=2020 and coauthor_name = 'Abdul Hanif Bin Zaini';
由于表主键包含coauthor_name,该查询可直接定位到目标行,返回准确数值1。
2. 查询所有合著者的最大合著数
若要查看该作者2020年所有合著者各自的最大合著数,需按coauthor_name分组聚合:
select coauthor_name, MAX(num_of_colab) AS max_2020 from coauthor_by_author where pid = '40/2499' and year=2020 GROUP BY coauthor_name;
此查询会返回每个合著者对应的最大合著数,你能清晰看到数值9所属的合著者,以及Abdul对应的数值1。
3. 优化表结构建议
你的表主键将num_of_colab作为聚类列,若同一个pid、year、coauthor_name组合下不会出现多个num_of_colab值,建议调整主键为:
CREATE TABLE IF NOT EXISTS coauthor_by_author ( pid text, year int, coauthor_name text, num_of_colab int, PRIMARY KEY ((pid), year, coauthor_name) ) WITH CLUSTERING ORDER BY (year desc);
这样每个(pid, year, coauthor_name)组合对应唯一的合著数,避免冗余数据,查询逻辑也更清晰。
内容的提问来源于stack exchange,提问作者user15558176
相关产品推荐
相关产品推荐

