Domanda

C'è un modo efficace per eliminare più righe in HBase o fa il mio uso caso odore come non adatto a HBase?

Non c'è 'grafico' un tavolo per esempio, che contiene gli elementi che sono nei grafici. chiavi Row sono nel seguente formato: chart|date_reversed|ranked_attribute_value_reversed|content_id

A volte voglio grafico rigenerare per una determinata data, quindi voglio eliminare tutte le righe a partire dal 'chart | date_reversed_1' fino a 'chart | date_reversed_2'. C'è un modo migliore di emettere un Elimina per ogni riga trovata da una scansione? Tutte le righe da eliminare stanno per essere vicini l'uno all'altro.

Ho bisogno di eliminare le righe, perché non voglio che un elemento (uno content_id) di avere più voci che dovrà se ranked_attribute_value fosse stato cambiato (il suo cambiamento è il motivo per cui le esigenze del grafico per essere rigenerati).

Essendo un principiante HBase, quindi forse potrei essere abusando righe per qualcosa che le colonne sarebbe meglio - se si dispone di un design suggerimenti, cool! O, forse le classifiche sono meglio generati in un file (ad esempio senza HBase per l'uscita)? Sto usando MapReduce.

È stato utile?

Soluzione

In primo luogo, venendo al punto della gamma di eliminazione non c'è gamma eliminare ancora in HBase, per quanto ne so. Ma c'è un modo per cancellare più di un file alla volta nel HTableInterface API . Per questo è sufficiente formare un oggetto di eliminazione con le chiavi di fila dalla scansione e metterli in un elenco e utilizzare l'API, fatto! Per rendere più veloce la scansione non includono alcuna famiglia colonna nel risultato della scansione come tutto ciò che serve è la chiave di fila per l'eliminazione di intere righe.

In secondo luogo, circa il disegno. In primo luogo la mia comprensione del requisito è, ci sono contenuti con Content ID e ciascuno ha contenuto i grafici generati contro di loro e questi dati vengono memorizzati; non ci può essere più grafici per contenuti tramite le date e dipende dal rango. Inoltre vogliamo grafico dell'ultima contenuto generato da mostrare nella parte superiore della tabella.

Per la mia ipotesi del requisito Io suggerirei di usare tre tavoli - auto_id, content_charts e generated_order. La chiave riga per content_charts sarebbe il suo contenuto id e la chiave riga per generated_order sarebbe stata una lunga, che avrebbe auto-decrementato con HTableInterface API . Per decrementare uso '-1' come la quantità di offset e inizializzare il Long.MAX_VALUE valore nella tabella auto_id al primo avviamento del app o manualmente. Così ora se si desidera cancellare i dati del grafico semplicemente pulire la famiglia colonna utilizzando Elimina e poi rimessi i nuovi dati e poi fare mettono in tabella generated_order. In questo modo l'ultimo inserimento sarà anche nella parte superiore della tabella ultima inserimento che conterrà l'id contenuto come un valore di cella. Se si vuole garantire generated_order ha solo una voce per il contenuto Salvare il generated_order id prima e prendere il valore e salvarlo in content_charts quando putting e prima di eliminare la famiglia di colonna prima eliminare la riga dalla generated_order. In questo modo si potrebbe lookup e grafici per un contenuto utilizzando 2 ottiene al massimo e non necessarie per le classifiche di scansione.

Spero che questo sia utile.

Altri suggerimenti

È possibile utilizzare la BulkDeleteProtocol che utilizza una scansione che definisce la parte rilevante (inizio fila, fila fine, filtri).

qui

ho incontrato la vostra situazione e questo è il mio codice per implementare ciò che si desidera

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();
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top