如何有效地将Google BigTable中的行读入pandas DataFrame

时间:2018-02-16 14:07:00

标签: python pandas bigtable pyarrow

使用案例

我正在使用Google BigTable存储这样的计数:

from google.cloud.bigtable import Client

instance = Client(project='project').instance('my-instance')
table = instance.table('mytable')

col1_sum = 0
col2_sum = 0
col3_max = 0

table.read_rows()
row_data.consume_all()

for row in row_data.rows:
    col1_sum += int.from_bytes(row['columnfamily']['col1'.encode('utf-8')][0].value(), byteorder='big')
    col2_sum += int.from_bytes(row['columnfamily']['col2'.encode('utf-8')][0].value(), byteorder='big')
    col3_value = int.from_bytes(row['columnfamily']['col3'.encode('utf-8')][0].value(), byteorder='big')
    col3_max = col3_value if col3_value > col3_max else col3_max

我想读取给定范围的行键的所有行(在这种情况下假设全部)并聚合每列的值。

一个天真的实现会查询行并迭代行,同时聚合计数,如下所示:

{{1}}

问题:

有没有办法在pandas DataFrame中高效加载生成的行,并利用pandas性能进行聚合?

我想避免使用for循环来计算聚合,因为它已知非常低效。

我知道Text()及其Apache Arrow project虽然HBase被提及为支持项目(并且Google BigTable被宣传为与HBase非常相似)但我似乎无法找到一种方法将它用于我在这里描述的用例。

3 个答案:

答案 0 :(得分:2)

在深入了解BigTable机制之后,当你调用ReadRows时,python客户端似乎会执行gRPC table.read_rows()调用。该gRPC调用通过HTTP / 2返回按键顺序的流响应(请参阅docs)。

如果API返回每行数据,在我看来,使用该响应的唯一有用方法是基于行。尝试以列式格式加载数据似乎没有什么用处,以避免必须遍历行。

答案 1 :(得分:1)

我不相信Cloud Bigtable有一个现有的pandas接口,但这是一个很好的构建项目,类似于https://github.com/pydata/pandas-gbq中的BigQuery接口。

答案 2 :(得分:1)

您可以将pdhbasegoogle-cloud-happybase一起使用。如果这不是开箱即用的,你或许可以从如何进行集成中获得灵感。

还有一个Cloud Bigtable / BigQuery integration,您可以将其与https://github.com/pydata/pandas-gbq集成(感谢Wes McKinney的提示)。