如何在Cassandra中使用SELECT DISTINCT查询唯一值

14

我想在Cassandra中使用SELECT DISTINCT,但我认为Cassandra不支持这些操作。那么我该如何在Cassandra中实现SELECT DISTINCT呢?是否可行?

3个回答

21

CQL 3.1.1 及以后版本仅支持对分区键执行 DISTINCT 操作。

现在 SELECT 语句允许列出分区键(使用 DISTINCT 修饰符)。请参阅 CASSANDRA-4536

Select Syntax

select_statement ::=  SELECT [ JSON | DISTINCT ] ( select_clause | '*' )
                      FROM table_name
                      [ WHERE where_clause ]
                      [ GROUP BY group_by_clause ]
                      [ ORDER BY ordering_clause ]
                      [ PER PARTITION LIMIT (integer | bind_marker) ]
                      [ LIMIT (integer | bind_marker) ]
                      [ ALLOW FILTERING ]
select_clause    ::=  selector [ AS identifier ] ( ',' selector [ AS identifier ] )
selector         ::=  column_name
                      | term
                      | CAST '(' selector AS cql_type ')'
                      | function_name '(' [ selector ( ',' selector )* ] ')'
                      | COUNT '(' '*' ')'
where_clause     ::=  relation ( AND relation )*
relation         ::=  column_name operator term
                      '(' column_name ( ',' column_name )* ')' operator tuple_literal
                      TOKEN '(' column_name ( ',' column_name )* ')' operator term
operator         ::=  '=' | '<' | '>' | '<=' | '>=' | '!=' | IN | CONTAINS | CONTAINS KEY
group_by_clause  ::=  column_name ( ',' column_name )*
ordering_clause  ::=  column_name [ ASC | DESC ] ( ',' column_name [ ASC | DESC ] )*


2
如果您在没有WHERE子句的情况下运行DISTINCT,请记住它仍然必须到达集群中的所有节点。 - Yury Kozlov

2
正如其他人所写的,Cassandra不支持基于列的distinct操作,只能在主键上进行。 有两种方法可以在Cassandra中实现此操作:
  1. 在应用程序中进行处理 - 需要从服务器加载并读取整个表格,并在代码中进行distinct操作。
  2. 创建一个辅助表格,在其中键是您想要进行distinct操作的列,在对原始表格执行操作时进行双重插入。
选择哪种方法取决于您的实际数据结构/大小和需求。如果表格很小或者您很少进行此操作,那么选项1就足够快。如果表格很大,或者您经常进行此查询,请选择第2种方法。

1
在CQL 3.1.1之前的Cassandra中,无法选择不同的值。
如果您使用旧版本的Cassandra,则需要在应用程序中实现该功能。您可以创建一个JIRA票证来请求实现此功能,尽管由于Cassandra对去规范化数据模型的偏向,似乎这个功能不会经常使用。
想象一下,在非常大的分布式集群中查找唯一行的情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接