如何使用 DataFlow 的 Cloud BigTable 连接器过滤行中最早的单元格?

How to filter the oldest cell in row with Cloud BigTable connector for DataFlow?

我正在尝试在我的 DataFlow 管道(使用 Beam SDK 2.4.0)中检索 BigTable 中某一行的最旧单元格。但是我似乎找不到任何类型的过滤器可以让我这样做?

在管道的更深处,最旧的单元格的值将与最新的单元格结合使用并写入 BigQuery。这是我到目前为止检索最新单元格的内容:

input.apply("Read protos from BigTable", BigtableIO.read()
                .withProjectId(config.getBigtableProject())
                .withInstanceId(config.getBigtableInstance())
                .withTableId(this.bigTableId)
                .withRowFilter(RowFilter.newBuilder()
                        .setFamilyNameRegexFilter("proto")
                        .setCellsPerColumnLimitFilter(1)
                        .build()))
     .apply("Row to TableRow", ParDo.of(new DoFn<Row, TableRow>() { ...

我希望有类似的东西,选择 1 个单元格但顺序相反?

有什么想法吗?

此功能是可行的,但没有简单的答案。一般来说,Bigtable 只允许一种形式的排序。对于单元格,版本顺序从大到小。

如果您想获得 "oldest" 的概念,您可以执行以下操作之一:

  1. 读取所有单元格,并获取最旧的单元格。
  2. 颠倒单元格的顺序。写的时候显式设置Long.MAX_VALUE - now,然后就可以使用标准排序了。
  3. 读取所有单元格,但使用 "strip value" 过滤器,这样您就不会 return 所有数据,然后使用过滤器对每一行进行另一次读取您在第一次阅读中找到的 "oldest" 时间戳。