BigTable:有没有更好的方法从部分行键中获取唯一值?

Posted

技术标签:

【中文标题】BigTable:有没有更好的方法从部分行键中获取唯一值?【英文标题】:BigTable: Is there a better approach to get unique values from partial row keys? 【发布时间】:2021-07-27 07:54:28 【问题描述】:

我在<name>#<date>#<id_value> 中创建了一个带有行键的大表

当我使用如下的行键前缀进行过滤时,我想获得唯一的 ID。

client = bigtable.Client(project=project_id, admin=True)
instance = client.instance(instance_id)
table = instance.table(table_id)
prefix = "phone#20190501"
end_key = prefix[:-1] + chr(ord(prefix[-1]) + 1)

# example row keys = ['phone#20190501#<id_value>', 'phone#20190501#<id_value>'...]

row_set = RowSet()
row_set.add_row_range_from_keys(prefix.encode("utf-8"),
                                end_key.encode("utf-8"))

rows = table.read_rows(row_set=row_set)
id_values = []
for row in rows:
    # get last id_value from row key
    id_value = str(row.key).replace('phone#20190501#', '')
    id_values.append(id_value)
unique_id_list = list(set(id_values))
print('COUNT: %s' % len(unique_id_list))

但是,我想知道如果我读取超过 1 亿行,我认为这种计算唯一 id_value 的方式可能会占用大量内存和 cpu。

有没有更好的方法来计算 Bigtable 中的唯一 ID 或标准 SQL 中的“UNIQUE”之类的函数

【问题讨论】:

【参考方案1】:

Bigtable 没有像 SQL 那样排序/唯一的方法,它必须在客户端完成 - 通过代码。但是,有一些性能注意事项可以帮助您。 你可以在下面的stack thread posted by DamPlz找到它:

    如果查询速度是必须的,loading the data 进入 BigQuery 而不是设置外部数据源将是最 有效的方式。不过,您可以做一些事情来 提高BigQuery 或BigTable 的性能。

    此连接器仍处于 Beta 阶段,并且有一些 performance considerations。我们还应该考虑 考虑到 BigTable 是一个 noSQL(非关系型)数据库 并且不适用于 SQL 查询。如果您正在探索 你想在你的应用程序中使用的数据模型,我推荐你 考虑all these options 并选择更适合的那个 满足您的需求。

    如果您想使用 SQL 查询数据,我会说这不是一个好的选择。了解 BigTable 的非关系架构, 读取数据的最有效方法是发送read requests。您可以在不同的地方找到一些关于此的代码示例 official documentation 中的语言。

【讨论】:

我会试一试的!谢谢!

以上是关于BigTable:有没有更好的方法从部分行键中获取唯一值?的主要内容,如果未能解决你的问题,请参考以下文章

需要从 cassandra 中删除的行键中添加数据

如何从 Cloud Bigtable cbt 工具获取密钥列表?

在不知道确切行键的情况下在 Bigtable 中查找最新时间戳

Bigtable 行键场景避免热点?

如何设置开始和结束行键 HBASE

Bigtable python客户端:如何检索大于给定值的最小行键