Эффективный способ удаления нескольких строк в HBASE
Вопрос
Существует ли эффективный способ удаления нескольких строк в HBASE или использует запах случаев использования, который не подходит для HBase?
Есть таблица, скажем, «график», которая содержит пункты, которые находятся в диаграммах. Клавиши строки в следующем формате:chart|date_reversed|ranked_attribute_value_reversed|content_id
Иногда я хочу восстановить график на данную дату, поэтому я хочу удалить все строки, начиная с «диаграммы | DATE_REVERSED_1» до «до карты | DATE_REVERSED_2». Есть ли лучший способ, чем выдавать удаление для каждой строки, найденной сканированием? Все строки будут удалены, будут близки друг к другу.
Мне нужно удалить строки, потому что я не хочу, чтобы один элемент (один Content_id) иметь несколько записей, которые он будет иметь, если его Ranked_attribute_Value был изменен (его изменение - это причина, по которой диаграмма должна быть регенерирована).
Будучи новичком HBASe, поэтому, возможно, я мог бы быть злоупотреблять строки для чего-то, что колонны будут лучше - если у вас есть предложения дизайна, круто! Или, возможно, графики лучше генерируются в файле (например, NO HBASE для вывода)? Я использую MapReduce.
Решение
Во-первых, приходя к точке диапазона Удалить нет диапазона Удалить еще в HBASE, AFAIK. Но есть способ удалить более одного ряда одновременно в HtableInterface API. Отказ Для этого просто образуйте объект удаления с ключами строки от сканирования и поместите их в список и используйте API, сделано! Чтобы сделать сканирование быстрее, не включайте какую-либо семейство столбца в результате сканирования, поскольку все, что вам нужно, это ключ строки для удаления целых строк.
Во-вторых, о дизайне. Сначала мое понимание требований есть, существуют содержимое с идентификатором контента, и каждый контент имеет сгенерированные диаграммы, и эти данные хранятся; Может быть несколько графиков на содержание через даты и зависит от ранга. Кроме того, мы хотим, чтобы диаграмма последнего сгенерированного контента показать в верхней части таблицы.
Для моего предположения о требовании я предложил использовать три таблицы - auto_id, content_charts и genered_order. Ключ строки для Content_Charts был бы его идентификатором содержимого, а ключ строки для Genered_order будет длинным, что будет Авто-уменьшение с использованием HtableInterface API. Отказ Для уменьшения использования «-1» как сумма для смещения и инициализации значения Long.max_value в таблице auto_id при первом запуске приложения или вручную. Так что теперь, если вы хотите удалить данные диаграммы, просто очистите семейство столбца, используя удалять А затем наденьте новые данные, а затем сделайте поставку в таблицу сгенерированных_Дранс. Таким образом, последняя вставка также будет в верхней части в новейшей таблице вставки, которая будет удерживать идентификатор содержимого в качестве значения ячейки. Если вы хотите убедиться, что Generated_order есть только одна запись на контент, сначала сохраняет идентификатор regreted_order и возьмите значение и сохранить его в Content_Charts при наведении и перед удалением семейства столбца. Таким образом, вы можете посмотреть, и графики для контента, используя 2, полученные на Max, а не требуется сканирования для диаграмм.
Я надеюсь, что это полезно.
Другие советы
Вы можете использовать BulkdeleteProtocol, который использует сканирование, которое определяет соответствующий диапазон (запуск строки, конечная строка, фильтры).
Видеть здесь
Я столкнулся с вашей ситуацией, и это мой код для реализации того, что вы хотите
Scan scan = new Scan();
scan.addFamily("Family");
scan.setStartRow(structuredKeyMaker.key(starDate));
scan.setStopRow(structuredKeyMaker.key(endDate + 1));
try {
ResultScanner scanner = table.getScanner(scan);
Iterator<Entity> cdrIterator = new EntityIteratorWrapper(scanner.iterator(), EntityMapper.create(); // this is a simple iterator that maps rows to exact entity of mine, not so important !
List<Delete> deletes = new ArrayList<Delete>();
int bufferSize = 10000000; // this is needed so I don't run out of memory as I have a huge amount of data ! so this is a simple in memory buffer
int counter = 0;
while (entityIterator.hasNext()) {
if (counter < bufferSize) {
// key maker is used to extract key as byte[] from my entity
deletes.add(new Delete(KeyMaker.key(entityIterator.next())));
counter++;
} else {
table.delete(deletes);
deletes.clear();
counter = 0;
}
}
if (deletes.size() > 0) {
table.delete(deletes);
deletes.clear();
}
} catch (IOException e) {
e.printStackTrace();
}