google bigtable 上的多行

multiple rows on google bigtable

我在向 Bigtable 添加新行而不是添加 3 行时遇到问题,理想情况下我希望它只有一个副本

这是我正在使用的代码

use Google\Cloud\Bigtable\BigtableClient;
use Google\Cloud\Bigtable\DataUtil;
use Google\Cloud\Bigtable\Mutations;

    $bigtable = new BigtableClient();

    $table = $bigtable->table('claster', 'configuration');
    $column_family_id = 'campaign';
    $column_id = 'dsakjhasdkjhasdkj';

    $mutations = (new Mutations())->upsert($column_family_id, "hahahaha", "campaign123");

    $v = $table->mutateRow("campaign1854", $mutations);

    printf('Successfully wrote row.' . PHP_EOL);
    echo '<pre>';
    print_r($v);
    echo '</pre>';

我在return中得到的是这个

Array
(
    [campaign] => Array
        (
            [hahahaha] => Array
                (
                    [0] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350256130000
                        )

                    [1] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350254707000
                        )

                    [2] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350253750000
                        )

                )

        )

)

此外,每次我尝试读取密钥时,它都会广告另一个值的副本,这是我用来读取的代码

    $bigtable = new BigtableClient();
    $table = $bigtable->table('claster', 'configuration');
    $data = $table->readRow('campaign1854');

    echo '<pre>';
    print_r($data);
    echo '</pre>';

我收到此回复的附加副本

Array
(
    [campaign] => Array
        (
            [hahahaha] => Array
                (
                    [0] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350256130000
                        )

                    [1] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350254707000
                        )

                    [2] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350253750000
                        )

                    [3] => Array
                        (
                            [value] => campaign123
                            [labels] => 
                            [timeStamp] => 1586350252676000
                        )

                )

        )

)

Bigtable 中的每一行都由 Cells 组成,Cells 是一组值和时间戳。我们称这些细胞版本。

每次您 运行 该脚本时,它都会在当前时间戳处添加另一个值,这会导致您的单元格中有多个版本。所以你提供的代码不会导致它写多个版本,它只会写一个版本,但是如果你多次 运行 代码,那么它会添加更多版本。

我不确定为什么阅读会导致编写更多版本,当您阅读代码 运行.

时,您一定是 运行 不小心写了代码

因此,您可以使用一些解决方案:

  1. 通过garbage collection允许每个单元格只有一个版本。您可以像这样使用 cbt 工具为每个单元配置一个版本

    cbt createfamily your-table cf2
    cbt setgcpolicy your-table cf2 maxversions=1
    
  2. 当您从 Bigtable 读取时,您可以应用 filter 以仅读取最新版本的单元格,如下所示:

    $filter = Filter::limit()->cellsPerColumn(1);
    $table->readRows([
        'filter' => $filter
    ]);