我对卡桑德拉很新,但到目前为止我取得了很好的进展。
$conn = new ConnectionPool('Cluster');
$User = new ColumnFamily($conn, 'User');
$index_exp = CassandraUtil::create_index_expression('email', 'John@dsaads.com');
$index_clause = CassandraUtil::create_index_clause(array($index_exp));
$rows = $User->get_indexed_slices($index_clause);
foreach($rows as $key => $columns) {
echo $columns['name']."<br />";
}
我正在使用此类查询从somebodys电子邮件地址获取具体日期。 但是,我现在想做两件事。
在mysql中我只是从select查询中删除'where属性',但是我觉得它在这里有点复杂了?
答案 0 :(得分:4)
在Cassandra中,没有简单的方法来计算所有行。你基本上必须扫描一切。如果这是你想经常做的事情,那你做错了。示例代码:
$rows = $User->get_range("", "", 1000000);
$count = 0;
foreach($rows as $row) {
$count += 1;
}
第二个答案是类似的:
$rows = $User->get_range("", "", 1000000, null, array("name", "email"));
foreach($rows as $key => $columns) {
echo $columns["name"]." ".$columns["email"];
}
答案 1 :(得分:1)
但是,如果您有许多用户,则不希望一直迭代它们。
最好每天进行一次或两次迭代,并将数据存储在cassandra或memcached / redis中。
我也会用单行做一个CF并将所有用户名(或用户键)放在单行上。然而有些人认为这是奇怪的做法,有些人不会推荐它。然后你做:
$ count = $ cf-&gt; get_count($ rowkey = 0);
注意get_count()操作也很慢,所以你仍然需要缓存它。
如果get_count()返回100,则需要将phpcassa升级到最新版本。
关于第二部分 - 如果你的用户少了4000-5000,我会再次做一些奇怪的事情 - 然后把它作为超级列放在单行上。然后只需一次操作即可阅读:
$ users = $ scf-&gt; get($ rowkey = 0,new ColumnSlice(“”,“”,5000)); foreach($ users as $ user){ echo $ user [“name”]。“”。$ user [“email”]; }