Как отфильтровать самую старую ячейку в строке с помощью коннектора Cloud BigTable для DataFlow? - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь получить самую старую ячейку определенной строки в BigTable в моем конвейере DataFlow (используя 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 голосов
/ 17 мая 2018

Эта функция возможна, но нет простого ответа. В общем, Bigtable допускает только одну форму заказа. В случае ячеек порядок версий от наибольшего к наименьшему.

Если вы хотите получить понятие «самый старый», вы можете сделать одно из следующих действий:

  1. Прочитайте все ячейки и найдите самую старую.
  2. Обратный порядок ячеек. Явно установите Long.MAX_VALUE - now, когда вы пишете, и тогда вы можете использовать стандартный порядок.
  3. Считать все ячейки, но использовать фильтр «полосовое значение», чтобы вы не возвращали все данные, а затем выполнить повторное чтение для каждой строки с фильтром для «самой старой» найденной отметки времени в первом чтении.
...