Найти строки без определенного семейства столбцов в Accumulo?

Есть ли простой способ найти строку в Accumulo, которая не имеет определенного семейства столбцов?

Например, вот несколько простых примеров данных (без отметки времени и видимости):

r|cf|cq|v
1|A |  | 
2|A |  | 
2|B |  |  
3|A |  | 
3|B |  |
4|C |  |

Я хотел бы создать сканер, который ищет строки без семейства столбцов «B». В этом случае он вернет строки 1 и 4.


person imichaeldotorg    schedule 28.12.2013    source источник


Ответы (1)


В Accumulo нет конкретного вызова API, который вы можете использовать, но это отличный пример того, почему концепция Accumulo (SortedKeyValue)Iterator — это круто. Мы можем написать небольшой код и выполнить эту фильтрацию на сервере, а не на клиенте.

Чтобы не затягивать, вот код: https://github.com/joshelser/RowsWithoutColumns

В частности, вы можете найти итератор: https://github.com/joshelser/RowsWithoutColumns/blob/master/src/main/java/accumulo/RowsWithoutColumnIterator.java

И некоторый код, который его вызывает: https://github.com/joshelser/RowsWithoutColumns/blob/master/src/test/java/test/RowsWithoutColumnIteratorTest.java

Следует отметить несколько вещей: RowsWithoutColumnIterator должен буферизовать всю строку в памяти, чтобы выполнить то, что вы просите. Этот подход приведет к нехватке памяти, если у вас есть строки со многими столбцами. Если у вас есть 1000 столбцов в строке (каждый ключ-значение составляет 1 КБ), сервер должен будет хранить 1 МБ в памяти. Если у вас нет широких столбцов, это не проблема. Этот пример также зависит от 1.5.0, но этот код может работать с любой версией Accumulo (если вы измените некоторые вызовы API в тестовом примере).

person elserj    schedule 29.12.2013
comment
Если вы часто делаете это, возможно, стоит подумать о создании индексной таблицы для хранения факта отсутствия столбца. В противном случае хорошей идеей будет отфильтровать строки, в которых они отсутствуют, на стороне сервера. Однако я бы, вероятно, написал приведенный выше пример с использованием RowFilter, чтобы избежать ограничения необходимости буферизации всей строки в памяти. - person Christopher; 29.12.2013
comment
Определенно да. Я забыл упомянуть об этом. Вы будете выполнять более эффективную фильтрацию, но это по-прежнему фильтрация, которая может быть чрезмерно медленной при поиске в большом корпусе и фильтрации многих результатов. - person elserj; 30.12.2013