如何过滤Cassandra中的数据?

时间:2010-09-23 14:10:12

标签: nosql cassandra

我一直在使用mySQL作为应用程序,我收集的数据越多,它就越慢。所以我一直在研究NOSQL选项。我在mySQL中拥有的一件事是从一堆连接创建的视图。该应用程序显示网格中的所有重要信息,用户可以选择范围,搜索等。在此数据集上。标准查询内容。

看看Cassandra,我已经根据我在storage-conf.xml中提供的参数对所有参数进行了排序。所以我会在SuperColumn中将某个字符串作为我的键,并在下面的列中保留一堆数据。但我只能按一个列排序,我不能在列中进行任何实际搜索而不拉动所有的SuperColumns,并循环遍历数据,对吧?

我不想在不同的ColumnFamilies中复制数据,因此我想确保Cassandra适合我。在Facebook,Digg,Twitter中,他们有很多搜索功能,所以也许我只是没有看到解决方案。

Cassandra是否有办法搜索或过滤SuperColumn或其相关列中的特定数据值?如果没有,是否有另一个NOSQL选项?

在下面的例子中,似乎我只能查询phatduckk,friend1,John等。但是,如果我想找到住在城市==“Beverley Hills”的ColumnFamily中的任何人?可以在不返回所有记录的情况下完成吗?如果是这样,我可以搜索城市==“贝弗利山”和州==“CA”吗?我似乎也不能这样做,但我想确定并看看我的选择是什么。

AddressBook = { // this is a ColumnFamily of type Super
  phatduckk: {    // this is the key to this row inside the Super CF
    friend1: {street: "8th street", zip: "90210", city: "Beverley Hills", state: "CA"},
    John: {street: "Howard street", zip: "94404", city: "FC", state: "CA"},
    Kim: {street: "X street", zip: "87876", city: "Balls", state: "VA"},
    Tod: {street: "Jerry street", zip: "54556", city: "Cartoon", state: "CO"},
    Bob: {street: "Q Blvd", zip: "24252", city: "Nowhere", state: "MN"},
  }, // end row
  ieure: {     
    joey: {street: "A ave", zip: "55485", city: "Hell", state: "NV"},
    William: {street: "Armpit Dr", zip: "93301", city: "Bakersfield", state: "CA"},
  },

}

4 个答案:

答案 0 :(得分:6)

您“不希望跨不同的ColumnFamilies复制数据”,但这就是您在Cassandra中执行此类查询的方式。见http://maxgrinev.com/2010/07/12/do-you-really-need-sql-to-do-it-all-in-cassandra/

答案 1 :(得分:5)

您无法在Cassandra中执行此类操作。有一些选择谓词可以在列键上设置,但它们所持有的值没有任何内容。查看API并检查get_slice / get_superslice和get_range查询类型。同样,所有这些都与ColumnFamily或SuperColumnFamily中的键有关,而不是值。

如果您想要所描述的那种功能,那么最好的选择是SQL数据库。在表上构建适当的索引,尤其是在查询最多的列上,您将看到查询性能的巨大差异。希望这会有所帮助。

答案 2 :(得分:0)

超级家庭不支持二级索引,但常规列族不支持。使用二级索引可以使用GetWhere语句。

以下是我的一个PHP项目中的一个示例:

public function GetCodeWithValue( $_value )
{
    $result = $this->getDbFamily()->getWhere(array('value' => $_value, 'used' => 0));

    if ( $this->IsValid( $result ))
        return $result->key();
    else 
        return null;
}

此代码使用此Cassandra API:https://github.com/kallaspriit/Cassandra-PHP-Client-Library f

答案 3 :(得分:0)

请注意,自提出问题以来,Cassandra添加了对Cassandra系统自动管理的索引的支持(​​我认为自0.8以来)。这可以回答某些人的问题,而不是管理自己的索引。

http://www.datastax.com/docs/1.1/dml/using_cli#indexing-a-column

话虽如此,我还想提到SQL数据库在创建索引时会复制大量数据以生成所述索引。在Cassandra它仍然非常便宜,特别是因为你可以非常优化它。主要问题是你必须手动保持一致性,SQL会透明地为你做。但这两种机制都使用完全相同的理论概念。

这有点像使用与您的应用程序相关的特化重新编程您自己的std :: string ...(例如,请考虑QString和CString!)