несколько строк в Google Bigtable - PullRequest
1 голос
/ 08 апреля 2020

У меня возникла проблема при добавлении новой строки в Bigtable вместо одной строки, в которой добавляется 3, в идеале я хочу, чтобы она имела только одну копию

, это код, который я использую

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

что я получаю взамен, это

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
                        )

                )

        )

)

кроме того, каждый раз, когда я пытаюсь прочитать ключ, он рекламирует другую копию значения, это код, который я использую читать

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

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

Я получаю этот ответ с дополнительной копией

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 Ответ

0 голосов
/ 08 апреля 2020

Каждая строка в Bigtable состоит из ячеек, представляющих собой набор значений и временных меток. Мы называем эти сотовые версии.

Каждый раз, когда вы запускаете этот сценарий, он добавляет другое значение в текущую отметку времени, в результате чего в вашей ячейке будет несколько версий. Таким образом, предоставленный вами код не заставляет его писать несколько версий, он будет писать только одну версию, но если вы запустите код несколько раз, он добавит больше версий.

Я не уверен, почему чтение приводит к написанию большего количества версий, вы должны запускать код записи случайно при запуске кода чтения.

Так что есть некоторые решения, которые вы можете используйте для этого:

  1. Разрешить каждой ячейке иметь только одну версию через сборщик мусора . Вы можете использовать инструмент cbt для настройки только одной версии для каждой ячейки, например:

    cbt createfamily your-table cf2
    cbt setgcpolicy your-table cf2 maxversions=1
    
  2. Когда вы читаете из Bigtable, вы можете применить фильтр только к прочитайте последнюю версию своей ячейки так:

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