Сканирование Bigtable по префиксу с помощью Python SDK - PullRequest
1 голос
/ 27 мая 2019

Я пытаюсь выполнить поиск по нескольким префиксам в Google Cloud Bigtable с помощью Python SDK. Я использую read_rows, и я не вижу хорошего способа явного поиска по префиксу.

Мой первый вариант - RowSet + RowRange. Я тестирую три запроса, и время, которое я получаю, составляет ~ 1,5 с, ~ 3,5 с и ~ 4,2 с, что на порядок медленнее, чем поиск с Node SDK (который имеет фильтр опция) ~ 0,19, ~ 0,13, ~ 0,46.

Второй вариант использует RowFilterChain + RowKeyRegexFilter. Производительность ужасна для двух запросов: ~ 3,1 с, ~ 70 с, ~ 75 с ~ 0,124 с, ~ 72 с, ~ 69 с. Похоже, что он делает полное сканирование. Это раздел кода:

            regex = f'^{prefix}.*'.encode()
            filters.append(RowKeyRegexFilter(regex)) 

Мой третий вариант - использование альтернативного SDK на основе Happybase, который имеет фильтрацию префиксов. С этим я получаю ~ 36 с, ~ 3 с, ~ 1 с ~ 0,4, ~ 0,1, ~ 0,17. Первый запрос включает несколько префиксов, и, похоже, он не поддерживает множественную фильтрацию в одном запросе, поэтому я выполняю столько же запросов, сколько префиксов, а затем объединяю итераторы. Два других, похоже, используют префиксный фильтр.

ОБНОВЛЕНИЕ : я удалил первый раз, потому что произошла ошибка со средой. После того, как все сделано правильно, времена для диапазона запросов неплохие, но, похоже, есть место для улучшения, поскольку тесты Happybase все еще быстрее, когда они используют поиск по префиксам.

Буду признателен за помощь в использовании нескольких поисков по префиксам в Happybase или фактического поиска по префиксам в основном Python SDK.

1 Ответ

1 голос
/ 28 мая 2019

Метод read_rows имеет два параметра start_key и end_key, которые можно использовать для эффективной фильтрации строк по ключу строки (см. документы ).За кулисами этот метод выполняет сканирование, поэтому, вероятно, это наиболее эффективный способ фильтрации строк на основе их ключей строк.

Например, предположим, у вас есть следующие ключи строк в таблице:

a
aa
b
bb
bbb

и вы хотите получить все строки с ключом строки с префиксом a, вы можете выполнить:

rows_with_prefix_a = my_table.read_rows(start_key="a", end_key="b")

Это будет сканировать строки только между a и b (b исключено), поэтому будут возвращены все строки с префиксом ключа строки a (a и aa в предыдущем примере).

...