【问题标题】:Bigtable Google Happybase Python KeyError when trying to do `counter_inc`尝试执行“counter_inc”时出现Bigtable Google Happybase Python KeyError
【发布时间】:2017-11-14 00:33:09
【问题描述】:

我不知道为什么,但counter_inc 方法不起作用,没有模拟器,指向一个开发真实实例。

片段:

from google.cloud import bigtable
from google.cloud import happybase

client = bigtable.Client(project='robbie-ai', admin=True)
instance = client.instance('visio-bt-staging')
connection = happybase.Connection(instance=instance)
connection.create_table('commons_TestBTModelsTable', {'family': None, 'counters': None})
table = connection.table('commons_TestBTModelsTable')
table.put('row-key1', {'family:surname': 'Trump'})
print("Getting row 'row-key1': {}".format(table.row(b'row-key1')))
table.counter_inc(b'row1', b'counters:qual1')

如果我这样做table.counter_inc(b'row1', 'counters:qual1') 是完全一样的。

作为脚本执行时:

root@2d21638ea17f:/app# python scripts/counters.py
Getting row 'row-key1': {b'family:surname': b'Trump'}
Traceback (most recent call last):
  File "scripts/counters.py", line 28, in <module>
    table.counter_inc(b'row1', b'counters:qual1')
  File "/usr/local/lib/python3.5/dist-packages/google/cloud/happybase/table.py", line 591, in counter_inc
    column_cells = modified_cells[column_family_id][column_qualifier]
KeyError: 'qual1'

是bug还是这个sn-p有问题?

【问题讨论】:

    标签: python google-cloud-platform bigtable google-cloud-bigtable happybase


    【解决方案1】:

    绝对是一个错误,它们对列 id 限定符和返回的 dict 键类型有不同的类型,commit() 返回的类型,而你从 split 得到的类型被解码为 str,

    这里:https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py#L577

    这里https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py#L582

    这里是https://github.com/GoogleCloudPlatform/google-cloud-python-happybase/blob/master/src/google/cloud/happybase/table.py#L591

    如果你降级:

    # As it is in the source code
    row = table._low_level_table.row(b'row-key1', append=True)
    column_family_id, column_qualifier = 'qual1'.split(':')
    row.increment_cell_value(column_family_id, column_qualifier, 1)
    row.commit()
    """outputs
    {'counters': {b'qual1': [(b'\x00\x00\x00\x00\x00\x00\x00\x01',
    datetime.datetime(2017, 6, 12, 14, 2, 28, 858000, tzinfo=<UTC>))]}}
    """
    # of course if using the original portion code it breaks with KeyError as the returned key type is bytes
    # Get the cells in the modified column,
    column_cells = modified_cells[column_family_id][column_qualifier]
    """outputs
    KeyError                                  Traceback (most recent call last)
    <ipython-input-24-fe55fb8c47c5> in <module>()
          1 # Get the cells in the modified column,
    ----> 2 column_cells = modified_cells[column_family_id][column_qualifier]
    
    KeyError: 'counters'
    """
    # But it works if re-encoded the column 
    # Get the cells in the modified column,
    column_cells = modified_cells[column_family_id][column_qualifier.encode()]
    column_cells
    [(b'\x00\x00\x00\x00\x00\x00\x00\x04',
      datetime.datetime(2017, 6, 12, 14, 16, 18, 150000, tzinfo=<UTC>))]
    

    这是针对 Python 3.5.2 的,无论如何 commit 响应返回异构键类型很奇怪,这对我来说似乎是错误的。

    解决方法,直到他们在 pypi 中修复它: 使用上述编码覆盖 counter_inc 方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2019-01-15
      • 2018-06-11
      • 2018-01-18
      • 1970-01-01
      相关资源
      最近更新 更多