python - 如何处理 BigTable Scan InvalidChunk 异常?

标签 python google-cloud-bigtable happybase

我正在尝试扫描 BigTable 数据,其中某些行是“脏”的 - 但根据扫描结果会失败,导致(序列化?)InvalidChunk 异常。 代码如下:

from google.cloud import bigtable
from google.cloud import happybase
client = bigtable.Client(project=project_id, admin=True)
instance = client.instance(instance_id)
connection = happybase.Connection(instance=instance)
table = connection.table(table_name)

for key, row in table.scan(limit=5000):  #BOOM!
    pass

省略一些列或将行限制为更少或指定开始和停止键,允许扫描成功。 我无法从堆栈跟踪中检测到哪些值有问题 - 它因列而异 - 扫描失败。这使得从源头清理数据变得困难。

当我利用 python 调试器时,我看到 block (类型为 google.bigtable.v2.bigtable_pb2.CellChunk)没有值(它是 NULL/undefined):

ipdb> pp chunk.value
b''
ipdb> chunk.value_size
0

我可以使用来自 rowkey 的 HBase shell 确认这一点(我从 self._row.row_key 获得)

所以问题变成了:BigTable 如何扫描过滤掉具有未定义/空/空值的列?

我从两个返回生成器的谷歌云 API 都遇到了同样的问题,这些生成器在内部将数据作为 block 通过 gRPC 流式传输:

  • google.cloud.happybase.table.Table#扫描()
  • google.cloud.bigtable.table.Table# read_rows().consume_all()

缩写的堆栈跟踪如下:

---------------------------------------------------------------------------
InvalidChunk                              Traceback (most recent call last)
<ipython-input-48-922c8127f43b> in <module>()
      1 row_gen = table.scan(limit=n) 
      2 rows = []
----> 3 for kvp in row_gen:
      4     pass
.../site-packages/google/cloud/happybase/table.py in scan(self, row_start, row_stop, row_prefix, columns, timestamp, include_timestamp, limit, **kwargs)
    391         while True:
    392             try:
--> 393                 partial_rows_data.consume_next()
    394                 for row_key in sorted(rows_dict):
    395                     curr_row_data = rows_dict.pop(row_key)

.../site-packages/google/cloud/bigtable/row_data.py in consume_next(self)
    273         for chunk in response.chunks:
    274 
--> 275             self._validate_chunk(chunk)
    276 
    277             if chunk.reset_row:

.../site-packages/google/cloud/bigtable/row_data.py in _validate_chunk(self, chunk)
    388             self._validate_chunk_new_row(chunk)
    389         if self.state == self.ROW_IN_PROGRESS:
--> 390             self._validate_chunk_row_in_progress(chunk)
    391         if self.state == self.CELL_IN_PROGRESS:
    392             self._validate_chunk_cell_in_progress(chunk)

.../site-packages/google/cloud/bigtable/row_data.py in _validate_chunk_row_in_progress(self, chunk)
    368         self._validate_chunk_status(chunk)
    369         if not chunk.HasField('commit_row') and not chunk.reset_row:
--> 370             _raise_if(not chunk.timestamp_micros or not chunk.value)
    371         _raise_if(chunk.row_key and
    372                   chunk.row_key != self._row.row_key)

.../site-packages/google/cloud/bigtable/row_data.py in _raise_if(predicate, *args)
    439     """Helper for validation methods."""
    440     if predicate:
--> 441         raise InvalidChunk(*args)

InvalidChunk: 

你能告诉我如何从 Python 扫描 BigTable,忽略/记录引发 InvalidChunk 的脏行吗? (try ... except 不会围绕生成器工作,它位于谷歌云 API row_data PartialRowsData 类中)

另外,你能告诉我在 BigTable 中对表扫描进行分块流式传输的代码吗? HappyBase batch_size & scan_batching 似乎不受支持。

最佳答案

这可能是由于这个错误:https://github.com/googleapis/google-cloud-python/issues/2980

错误已修复,因此这应该不再是问题。

关于python - 如何处理 BigTable Scan InvalidChunk 异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40788707/

相关文章:

hadoop - thrift 在我的 HBase master 上运行吗?如何与Happybase连接?

python - 如何使用 seaborn 在同一张图上绘制两个 fiddle 图系列?

python - 在 Tkinter 中使用鼠标事件绘制矩形

python - 如何生成以文本作为 ytick 标签的绘图

cassandra - 与 Bigtable 相比,Cassandra 数据模型中关于列族的概念差异?

python - 如何使用 Python 通过 Cloud Dataflow 将 CSV 文件导入 Cloud Bigtable?

python - 将 Google Cloud Storage 数据加载到 bigtable 中

python - AWS Hbase : Invalid method name: 'getTableNames'

python - 使用 ModelForm 更新 Django 模型的某些字段

python - 如何使用单个 API 调用扫描 HappyBase 中的行集?