Как добавить несколько ячеек в строку в таблице в Bigtable? - PullRequest
1 голос
/ 19 марта 2019

Я пробовал так много разных примеров проектов на github и много раз читал руководство по api bigtable. Я не могу понять, почему это не позволяет мне устанавливать несколько ячеек подряд. В показанных примерах они имеют только примеры с одним значением в строке.

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

Я использовал как команду mutate_rows для таблицы, так и команду commit в строке, но ни одну из них не добавил. Я также понимаю, что команда row commit буквально просто:

table.mutate_rows([row])

Итак, я не могу понять, что я делаю неправильно.

import base64
import json
import ast
import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters


def function(event, context):

    data = base64.b64decode(event['data']).decode('utf-8')
    data = ast.literal_eval(data)

    print(type(data))
    print(data)

    # Create a Cloud Bigtable client.
    client = bigtable.Client(project=project_id, admin=True)

    # Connect to an existing Cloud Bigtable instance.
    instance = client.instance(instance_id)

    print('opening the {} table.'.format(table_id))
    table = instance.table(table_id)

    # [START writing_rows]

    max_versions_rule = column_family.MaxVersionsGCRule(2)
    column_family_id = 'states'.encode('utf-8')
    column_families = {column_family_id: max_versions_rule}
    if not table.exists():
        table.create(column_families=column_families)
    else:
        print("Table {} already exists.".format(table_id))


    row_key = (data['serial_num'] + str(datetime.datetime.utcnow())).encode('utf-8')

    row_obj = table.row(row_key)

    for key, value in data.items():
        row_obj.set_cell(
            column_family_id, 
            str(key).encode('utf-8'), 
            str(value).encode('utf-8'), 
            timestamp=datetime.datetime.utcnow()
        )

    print(row_obj)
    print(str(row_obj))
    print(row_obj.table)
    print(row_obj.row_key)

    row_obj.commit()

    '''
    table.mutate_rows([row_obj])
    '''

    print('Inserted/updated data.')

    # [END writing_rows]

    # [START creating_a_filter]

    # Create a filter to only retrieve the most recent version of the cell
    # for each column across entire row.
    row_filter = row_filters.CellsColumnLimitFilter(1)

    # [END creating_a_filter]

    # [START read_rows]

    row = table.read_row(row_key, row_filter)
    print(row)
    for key, value in data.items():
        cell_values = row.cells[column_family_id][column][0]
        print('{} = {} should be {}'.format(key, cell_values, value))

    # [END read_rows]

1 Ответ

1 голос
/ 20 марта 2019

Это решение, которое я выбрал

import base64
import json
import ast
import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters


def hello_pubsub(event, context):

    data = base64.b64decode(event['data']).decode('utf-8')
    data = ast.literal_eval(data)

    print(type(data))
    print(data)

    # Create a Cloud Bigtable client.
    client = bigtable.Client(project=project_id, admin=True)

    # Connect to an existing Cloud Bigtable instance.
    instance = client.instance(instance_id)

    print('opening the {} table.'.format(table_id))
    table = instance.table(table_id)

    # [START writing_rows]

    max_versions_rule = column_family.MaxVersionsGCRule(2)
    column_family_id = 'state'
    column_families = {column_family_id: max_versions_rule}
    if not table.exists():
        table.create(column_families=column_families)
    else:
        print("Table {} already exists.".format(table_id))


    row_key = (data['serial_num'] + " " + str(datetime.datetime.utcnow())).encode('utf-8')

    rows = [] 

    for key, value in data.items():
        row = table.row(row_key)
        row.set_cell(column_family_id, 
            str(key).encode('utf-8'), 
            str(value), 
            timestamp=datetime.datetime.utcnow())
        rows.append(row)


    table.mutate_rows(rows)

    print('Inserted/updated data.')

    # [END writing_rows]

    # [START creating_a_filter]

    # Create a filter to only retrieve the most recent version of the cell
    # for each column across entire row.
    row_filter = row_filters.CellsColumnLimitFilter(1)

    # [END creating_a_filter]

    # [START read_rows]

    partial_rows = table.read_row(row_key, row_filter)
    print(partial_rows.cells)
    for key, value in data.items():
        cell_value = partial_rows.cell_value(column_family_id, str(key).encode('utf-8'))
        print('{} = {} should be {}'.format(key, cell_value, value))

    # [END read_rows]
...