Как отфильтровать самую старую ячейку в строке с помощью коннектора Cloud BigTable для DataFlow?

Я пытаюсь получить самую старую ячейку определенной строки в 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 ячейку, но в обратном порядке?

Любые идеи?


person Hannes Holst    schedule 16.05.2018    source источник
comment
Во-первых, вы не можете установить две разные вещи в одном и том же RowFilter. Вам нужно будет создать RowFilter.chain (), который содержит два других RowFilter. Я не уверен, как получить самое старое, но я разберусь.   -  person Solomon Duskis    schedule 16.05.2018
comment
Да, я знал о цепочке RowFilters, это очень полезно. Однако получение самой старой клетки все еще озадачивает меня. Спасибо, что изучили это!   -  person Hannes Holst    schedule 17.05.2018


Ответы (1)


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

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

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