【问题标题】:multiple rows on google bigtablegoogle bigtable 上的多行
【发布时间】:2020-04-08 13:50:39
【问题描述】:

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

这是我正在使用的代码

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>';

我得到的回报是这个

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
                        )

                )

        )

)

【问题讨论】:

    标签: php google-cloud-bigtable bigtable


    【解决方案1】:

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

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

    我不确定为什么读取会导致写入更多版本,当您运行读取代码时,您一定是不小心运行了写入代码。

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

    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
      ]);
      

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 2017-01-30
      • 2020-11-18
      • 2022-11-16
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多