0

我的目标是遍历节点中特定 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 中的所有现有行?

4

1 回答 1

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

于 2014-07-27T19:27:48.107 回答