google bigtable 上的多行

Posted

技术标签:

【中文标题】google bigtable 上的多行【英文标题】:multiple rows on google 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
                        )

                )

        )

)

【问题讨论】:

【参考方案1】:

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

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

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

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

    通过garbage collection 允许每个单元格只有一个版本。您可以使用 cbt 工具为每个单元格仅配置一个版本,如下所示

    cbt createfamily your-table cf2
    cbt setgcpolicy your-table cf2 maxversions=1
    

    当您从 Bigtable 读取数据时,您可以应用 filter 来仅读取最新版本的单元格,如下所示:

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

【讨论】:

以上是关于google bigtable 上的多行的主要内容,如果未能解决你的问题,请参考以下文章

HBase简介及集群安装

Bigtable IO 连接器是不是有 Apache Beam DynamicDestinations?

Google Bigtable (中文版)

使用 Python 的 Bigtable 模拟器和 Google 发现资源

无法使用 Google 的规范示例从 Bigtable 读取数据

Bigtable---分布式的结构化数据存储系统