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 上的多行的主要内容,如果未能解决你的问题,请参考以下文章
Bigtable IO 连接器是不是有 Apache Beam DynamicDestinations?
使用 Python 的 Bigtable 模拟器和 Google 发现资源