【问题标题】:Row Iteration not working行迭代不起作用
【发布时间】:2014-09-18 20:10:12
【问题描述】:

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

【问题讨论】:

    标签: php cassandra phpcassa


    【解决方案1】:

    我不是 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, 卡罗

    【讨论】:

    • 我不确定我是否可以像 getKey() 那样从 smth 中获取令牌。我可以获得行键,但我不知道如何从它生成令牌。它可以与 randomPartitioning 一起使用吗?
    • 是的,随机分区。尝试将最后检索到的行键设置为开始键
    • 我不能,因为 key!==token。我没有 getKey() 函数,但我可以获得行键。我找不到将密钥转换为令牌的方法。
    • 我认为 get_range 是您应该使用的功能:thobbs.github.io/phpcassa/api/… 按照我的示例使用键而不是令牌
    • get_range() 接收密钥,而不是令牌。因为我有 randomPartitioning,所以有可能会丢失一些行
    猜你喜欢
    • 2020-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多