2016-02-02 3 views
2

Я был смущен тем, как фильтры работают в HBase (или, в основном, эквивалентно, в HappyBase), которые я использую для взаимодействия с HBase). Источником моей путаницы является то, что я не могу понять, что делают фильтры.Фильтры в HBase: Предназначены для фильтрации данных по ряду или по столбцу или для обоих?

Некоторые фильтры, такие как SingleColumnValueFilter, приводят к тому, что строки не должны испускаться в зависимости от значения одного из их столбцов. Это имеет смысл - на мой взгляд, для этого нужны фильтры. Однако другие фильтры, такие как FirstKeyOnlyFilter, как представляется, не фильтруются в строковом смысле, а скорее фильтруют данные, которые всплывают на запросчик - то есть они фильтруют по столбцу, как и аргумент columns. Не только это, но они, по-видимому, влияют на то, получают ли другие фильтры доступ к данным.

Возможно, я просто использую их неправильно. Но для меня «фильтр» должен удалять элементы, основанные на выходе, который работает с их свойствами, например «Найди мне всех людей высотой более 7 футов!». Но поведение FirstKeyOnlyFilter, по крайней мере, в HBase, похоже, более сродни: «Принесите мне все левое ухо и ничего больше!» Кроме того, если у меня есть фильтр:

SingleColumnValueFilter('body', 'height', =, 'regexstring:^over7ft$') AND FirstKeyOnlyFilter, FirstKeyOnlyFilter, похоже, ограничивает доступ первого фильтра к семейству столбцов: столбец «тело: высота».

Что имеется с этим выбором дизайна? Фильтр выше выглядит так, как будто он говорит: «Яркой меня называют всех ровно в 7 футов!» но вместо этого он говорит что-то более похожее на «Яркое меня, если имя имеет высоту 7 футов!». Первый ключ строки не имеет столбцов, а имена могут иметь высоту.

Что я делаю неправильно? Является ли это особенностью HappyBase или это то же самое в HBase?

ответ

2

Фильтры соответствуют по столбцам, доступным в каждой строке.

Как вы заметили, некоторые фильтры HBase ограничивают столбцы, возвращаемые клиенту. Это намеренный выбор дизайна для уменьшения объема памяти и сетевых ресурсов, используемых во время вызова клиента.

Напомним, что HBase действительно является сопоставлением строк в серии пар ключ-значение (ключ в ключевом значении называется классификатором столбцов). Они не являются строго набором в том, что базовая абстракция данных действительно является значением rowkey + columnQualifier для значения (a Cell). Фильтры работают на уровне ячеек. Это также объясняет, почему классификаторы столбцов рекомендуются быть короткими, поскольку они фактически хранятся с каждой строкой/значением.

FirstKeyOnlyFilter предназначен для возврата как можно меньше данных, сохраняя при этом знание того, что rowkey существует с некоторым отображением значения ключа. Это может быть любое преобразование значения ключа, которое возвращается.

В качестве альтернативы вы можете использовать KeyOnlyFilter вместо FirstKeyOnlyFilter, который будет обнулять значения, связанные с каждым возвращаемым столбцом. Это должно дать вам возможность соответствовать по мере необходимости при минимизации возвращаемых данных.

+0

Интересно. Но что делать, если я хотел бы уменьшить сетевой ввод-вывод, но не обязательно читать из базы данных? Т.е., «верните мне все ключи строк, где строка имеет cf: c значение x» – eriophora

+0

, я обновил ответ –

+0

@eriophora ответ на ваш комментарий выше: используйте фильтр столбцов и FirstKeyOnlyFilter и передайте параметр «должен соответствовать всем» к объекту сканирования. – halil