【问题标题】:Keeping min/max value in a BigTable cell将最小值/最大值保存在 BigTable 单元格中
【发布时间】:2019-07-18 23:16:20
【问题描述】:

我有一个问题,如果我能够向 BigTable 发送 ReadModifyWrite 请求,它只会在新值大于/小于现有值时覆盖该值,这将非常有帮助。这有可能吗? 注意:我想到了一种使用时间戳作为实际值的 hacky 方式,并且版本的最大数量为 1,这样可以保留“最新”值,即更高的时间戳。但这些时间戳的值将是 1 到 10,而不是 15 亿。这行得通吗?

我查看了现有的 API,但没有找到任何可以帮助我做到这一点的东西。它似乎在 DynamoDB 中可用,所以我想要求 BigTable 也有它是合理的https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html#API_UpdateItem_RequestSyntax

【问题讨论】:

    标签: google-cloud-dataflow apache-beam bigtable google-cloud-bigtable apache-beam-io


    【解决方案1】:

    您的时间戳方法可能会起作用,但与基于年龄的垃圾收集之类的东西交互效果不佳。

    我还假设您的意思是 CheckAndMutate 而不是 ReadModifyWrite?前者允许您进行有条件的覆盖,后者允许您进行无条件的增量/追加。如果您实际上想要一个仅在结果更大时才有效的增量,请确保您只发送正增量;)

    如果您的客户端语言支持它,我的建议是使用带有value_range_filter 的 CheckAndMutateRow 请求。这将要求您对值使用固定宽度的编码,但这与重新使用时间戳没有什么不同。

    示例:如果您想将值设置为 000768,但前提是这会增加,请使用从 000000 到 000767(含)的 value_range_filter,并在 CheckAndMutate 的 true_mutation 中写入。

    【讨论】:

    • 是的,我会通过时间戳方法来牺牲 TTL 功能,幸运的是,在我的情况下它是可行的 :) 但它可能不是。我认为 Dataflow BigTable 应该支持“write max/min”,你不觉得吗?据我所知,它不违反任何数据流/大表原则。
    • > “只要确保你只发送正增量” => 这在我的情况下是不可能的:/
    • 关于 ReadModifyWrite:不幸的是 protobuf 类型 Mutation 没有 CheckAndMutateRow。是否可以从 Dataflow 步骤中将 CheckAndMutateRow 发送到 BigTableIO.Write 中?
    • 啊,在 Dataflow 中这可能更棘手。 AIUI 我们不会暴露像 ReadModifyWrite 或 CheckAndMutateRow 这样的非幂等写入,因为我们无法阻止 Dataflow 在收到错误时重试。我很惊讶原子性在批处理环境中对你很重要吗?你能做非原子读写吗?
    • 原子性对我来说并不重要。 “保持最大值”不是幂等操作吗?关键是以更便宜的方式保持最大值,而不是添加数十亿次读取只是为了检查它是否大于 x
    猜你喜欢
    • 2018-07-04
    • 2019-12-21
    • 1970-01-01
    • 2020-05-04
    • 2020-02-02
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    相关资源
    最近更新 更多