Как я могу сканировать наборы строк в HappyBase одним вызовом API? - PullRequest
2 голосов
/ 27 апреля 2020

Я хочу просканировать большую таблицу на наличие списка идентификаторов (или префиксов идентификаторов) (используя Python HappyBase).

Есть ли способ сделать это на стороне сервера? То есть я хотел бы отправить список строк начала / остановки для сканирования в одном вызове API, а не выполнять длинный ряд вызовов API.

Вот пример. Для ключей my_big_tables:

2019/1
2019/2
2019/3
...
2020/1
2020/2
2020/3
2020/4
..

В одном запросе я хотел бы получить все записи за месяцы 1 и 2 за все годы. Результаты должны быть:

2019/1
2019/2
2020/1
2020/2

1 Ответ

2 голосов
/ 02 мая 2020

Вместо использования аргументов row_start и row_stop в Table.scan () это может быть лучше подходит для аргумента filter с регулярным выражением.

См. Ссылка API для получения подробной информации об аргументе фильтра:

Аргумент ключевого слова filter также поддерживается (помимо фильтров диапазона столбцов и строк, поддерживаемых здесь). Пользователи HappyBase / HBase будут использовать это как строку фильтра HBase. (Подробнее об этих фильтрах см. Комиссионные документы .) Однако Google Cloud Bigtable не поддерживает эти строки фильтров, поэтому вместо них следует использовать RowFilter.

RowFilter - это тип, предоставляемый библиотекой Google Bigtable. Вот документы . Предполагая, что поле идентификатора, на которое вы ссылаетесь, является вашим ключом строки, мы можем использовать RowKeyRegexFilter , чтобы отфильтровать идентификаторы по шаблону, который вы описали.

Начнем с того, что подойдем с регулярным выражением, чтобы сопоставить список идентификаторов на нужные месяцы. Например, если вы хотите отфильтровать идентификаторы по годам за декабрь и январь, вы можете использовать это (обратите внимание, что вы должны go от самого большого числа к самому короткому) - см. эту ссылку для проверки регулярного выражения:

\d\d\d\d\/(12|1)

Вот попытка написать функцию, которая создает Google Scantable запрос на сканирование HappyBase с соответствующим фильтром, где table - это таблица HappyBase, а months - это список целых чисел. Обратите внимание, что я не проверил этот код, но, надеюсь, он по крайней мере даст вам отправную точку.

from google.cloud.bigtable.row_filters import RowKeyRegexFilter

def filter_by_months(table, months):
    months_reversed = sorted(months, reverse=True)
    months_strings = [str(month) for month in months_reversed]
    months_joined = "|".join(months_strings)

    key_filter = RowKeyRegexFilter('\d\d\d\d\/({})'.format(months_joined))
    return table.scan(filter=key_filter)
...