我想SELECT DISTINCT
在 Cassandra 中,但我认为 Cassandra 不支持这些操作。我SELECT DISTINCT
在卡桑德拉怎么办?可能吗?
问问题
33098 次
3 回答
21
CQL 3.1.1及更高版本仅支持分区键的 DISTINCT 操作。
SELECT 语句现在允许列出分区键(使用 DISTINCT 修饰符)。见卡桑德拉-4536。
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 ] )*
于 2014-04-23T21:49:57.720 回答
2
正如其他人所写,Cassandra 中的列不支持不同的列,仅在主键上。使用 cassandra 执行此操作的两个选项:
- 应用程序中的进程 - 需要从服务器加载读取整个表并在代码中执行不同的操作。
- 创建一个辅助表,其中的键是您想要区分的列,并在对原始表执行操作时在此处双重插入。
两者之间的决定取决于您的实际数据结构/大小和需求,如果表大小很小或者您很少执行此操作,选项 1 将足够且快速,如果表很大,和/或您这样做查询很多次都与#2一起使用。
于 2016-03-07T12:05:27.933 回答
1
在 CQL 3.1.1 之前,无法在 cassandra 中选择不同的值。
如果您有旧版本的 Cassandra,则必须在应用程序中实现该功能。您可以创建一个JIRA 票证来请求实现该功能,尽管由于 cassandra 偏向于非规范化数据模型,因此该功能似乎不会经常使用。
想象一下,必须在一个非常大的分布式集群中找到唯一的行。
于 2013-08-15T13:02:05.087 回答