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

时间:2018-05-16 14:11:55

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

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

在管道的下方,最旧单元格的值将与最新单元格一起使用并写入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个单元但反向顺序?

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

如果您想获得“最老”的概念,可以执行以下操作之一:

  1. 阅读所有单元格,并获取最旧单元格。
  2. 反转单元格的顺序。在您编写时明确设置Long.MAX_VALUE - now,然后您可以使用标准排序。
  3. 读取所有单元格,但使用“条带值”过滤器,以便不返回所有数据,然后使用针对您找到的“最旧”时间戳的过滤器跟进每行的另一个读取在第一次阅读。