Эффективный способ удаления нескольких строк в HBASE

StackOverflow https://stackoverflow.com/questions/4618980

  •  30-09-2019
  •  | 
  •  

Вопрос

Существует ли эффективный способ удаления нескольких строк в 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();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top