在不知道确切行键的情况下在 Bigtable 中查找最新时间戳
Posted
技术标签:
【中文标题】在不知道确切行键的情况下在 Bigtable 中查找最新时间戳【英文标题】:Finding the latest timestamp in Bigtable without knowing exact row key 【发布时间】:2021-01-18 09:23:08 【问题描述】:我有一个问题,我没有找到合适的解决方案。 我有一个行键,例如 project#location#raw#timestamp
我想查找具有给定前缀的最新时间戳的行。 例子: 我想找到带有指定项目和位置的最新时间戳的行。 项目1#Location1#raw#??
有什么办法吗?
我想天真的方法是查询很长一段时间,然后在python中排序以找到最新的时间戳。但是我觉得这样比较浪费
【问题讨论】:
【参考方案1】:由于时间戳嵌入在行键本身中,您将不得不使用您在问题中提到的正则表达式:Project1#Location1#raw#??
来过滤记录。对于排序,您可以在 documentation 中看到:
当 Cloud Bigtable 存储行时,它会按行键按字典顺序对它们进行排序
所以你根本不用排序,只要得到查询结果的最后一个位置,就会是你想要的记录。
您提到您正在考虑使用 Python,在这种情况下,您可以检查 this example in the documentation 的行键正则表达式,了解如何获取所需的数据,之后您所要做的就是打印 rows
的最后一个位置在那个例子中。为此,如 cmets 中所述,您可以执行以下代码:
rows.consume_all()
data = rows.rows
print(data)
print(list(data)[-1])
此外,正如 cmets 中所讨论的,如果性能对您来说是个问题,请考虑在您的搜索中使用行前缀而不是过滤器,如 here 所述。 documentation 表示使用过滤器的读取比不使用过滤器的读取要慢,并且尽可能限制行集是提高性能的第一步,因此这可能比我之前建议的方法更好。
【讨论】:
感谢 Rafael,我如何使用 Regex 获得查询结果的最后位置?你介意给我看看吗? 我已经编辑了答案,其中包含指向文档中一个示例的链接,该示例几乎可以满足您的需求。 对不起,这可能是一个非常愚蠢的问题,请原谅我。我知道行键正则表达式,所以说我将正则表达式缩小到 Project1#Location1#raw#smtg,bigtable 将需要扫描与该正则表达式相关的表中的许多行......并返回给我很多行让python在for循环中处理,我需要时间才能到达循环的结尾,这肯定不是有效的吗?还是我没有正确考虑这一点?某种程度上,我还在把结果排序在前面? 并不是真正的“排序”,因为它已经按字典顺序排序。但是我的意思是Bigtable仍然需要返回一大堆数据,我通过for循环到达最后一个条目 我想我的问题的一个更精炼的版本是:在 for 循环中,我如何直接转到“rows”对象中的最后一行以获取最新条目【参考方案2】:作为替代方法,请考虑创建一个边表来索引时间戳。 project#location#timestamp 之类的东西。这将使您能够轻松地找到每个项目和位置的最新时间戳,代价是必须维护 2 个表(2 次写入、附加数据等)。
【讨论】:
以上是关于在不知道确切行键的情况下在 Bigtable 中查找最新时间戳的主要内容,如果未能解决你的问题,请参考以下文章
如何在不传递值和 rowid 的情况下在 H base-shell 中创建表?