0

在将数据导入我的 Cassandra 测试集群后,我发现我需要为某些列创建二级索引。由于数据已经在集群内,我想通过更新 ColumnFamilyDefinitions 来实现这一点。

现在,问题是:这些列是动态列,因此它们对 getColumnMetaData() 调用不可见。

如何通过 Hector 检查是否已经创建了二级索引,如果不是这样,则创建一个?(我认为如何创建它的部分可以在http://comments.gmane.org/gmane.comp.db.hector.user/3151中找到)

如果这不可能,我是否必须将此动态列族中的所有数据复制到静态列族中?

4

1 回答 1

0

无需将动态列族中的所有数据复制到静态列族中。

怎么办??让我用一个例子来解释你,假设你有一个下面提到的 CF 模式:

CREATE TABLE sample (
  KEY text PRIMARY KEY,
  flag boolean,
  name text
)

注意我已经对flagname进行了索引。

现在这里有一些 CF 中的数据。

 KEY,1 | address,Kolkata | flag,True | id,1 | name,Abhijit
 KEY,2 | address,Kolkata | flag,True | id,2 | name,abc
 KEY,3 | address,Delhi | flag,True | id,3 | name,xyz
 KEY,4 | address,Delhi | flag,True | id,4 | name,pqr
 KEY,5 | address,Delhi | col1,Hi | flag,True | id,4 | name,pqr

从数据中您可以了解到addressidcol1都是动态创建的。

现在,如果我查询类似的东西

SELECT * FROM sample WHERE flag =TRUE AND col1='Hi';

注意: col1 未编入索引,但我可以使用该字段进行过滤

输出:

  KEY | address | col1 | flag | id | name
 -----+---------+------+------+----+------
    5 |   Delhi |   Hi | True |  4 |  pqr

另一个查询

 SELECT * FROM sample WHERE flag =TRUE AND id>=1 AND id <5 AND address='Delhi';

注意:这里既没有索引 id 也没有索引地址,我仍然得到输出

输出:

  KEY,3 | address,Delhi | flag,True | id,3 | name,xyz
  KEY,4 | address,Delhi | flag,True | id,4 | name,pqr      
  KEY,5 | address,Delhi | col1,Hi | flag,True | id,4 | name,pqr

所以基本上,如果你有一列的值总是你知道的,并且它被索引。然后,您可以轻松地过滤其余动态列,将它们与索引的始终为正的列聚合在一起。

于 2013-05-08T09:15:54.800 回答