行迭代不起作用

时间:2014-07-27 13:56:19

标签: php cassandra phpcassa

我的目标是迭代节点中特定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(); 
            }

        }
    }
}
  • get_range_by_token()使用$ params覆盖的默认参数。

在每批中我得到相同的10行密钥 如何迭代大型Cassandra DB中的所有现有行?

1 个答案:

答案 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, 卡罗