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 に答える