我的目标是迭代节点中特定ColumnFamily中的所有行 这是php代码(使用我在phpcassa上的包装器):
$ring = $cass_db->describe_ring();
foreach ($ring as $ring_details)
{
$start_token = $ring_details->start_token;
$end_token = $ring_details->end_token;
if ($start_token != null && $end_token != null)
{
$i = 0;
$batch_size = 10;
$params = array(
'token_start' => $start_token,
'token_finish' => $end_token,
'row_count' => $batch_size,
'buffer_size' => 1000
);
while ($batch = $cass_db->get_range_by_token('myColumnFamily', $params))
{
var_dump('Batch# '.$i);
foreach ($batch as $row)
{
$row_key = $row[0];
$row_values = $row[1];
var_dump($row_key);
}
$i++;
//Just to stop infinite loop
if ($i > 14)
{
die();
}
}
}
}
在每批中我得到相同的10行密钥 如何迭代大型Cassandra DB中的所有现有行?
答案 0 :(得分:0)
我不是PHP开发人员,因此我可能会误解代码中的某些内容。更多,您没有指定您正在使用的cassandra版本。
对所有行的迭代通常以空令牌开始和结束,并在每次迭代中重新定义起始令牌。在您的代码中,我无法看到您在每次迭代中重新定义token_start的位置。如果你不重新定义它,你每次都要查询相同范围的标记cassandra,你将得到相同的结果集。
你的代码应该做这样的事情......
start_token = '';
end_token = '';
page_size = 100;
while ( get_range_by_token('cf', start_token, end_token, page_size) {
// here I should get page_size rows (unless I'm in last iteration or table rows is smaller than page_size elements)
start_token = rows[rows.size()].getKey();
}
HTH, 卡罗