Effiziente Möglichkeit, mehrere Zeilen in HBase zu löschen

8

Gibt es eine effiziente Möglichkeit, mehrere Zeilen in HBase zu löschen, oder riecht mein Anwendungsfall nicht nach HBase?

Es gibt eine Tabelle, die "Diagramm" sagt, die Elemente enthält, die sich in Diagrammen befinden. Zeilenschlüssel haben folgendes Format: chart|date_reversed|ranked_attribute_value_reversed|content_id

Manchmal möchte ich das Diagramm für ein bestimmtes Datum neu generieren, also möchte ich alle Zeilen löschen, die von 'chart | date_reversed_1' bis 'chart | date_reversed_2' beginnen. Gibt es einen besseren Weg, als für jede durch einen Scan gefundene Zeile einen Löschvorgang auszuführen? Alle Zeilen, die gelöscht werden sollen, liegen dicht beieinander.

Ich muss die Zeilen löschen, weil ich nicht möchte, dass ein Element (eine content_id) mehrere Einträge hat, wenn sein ranked_attribute_value geändert wurde (seine Änderung ist der Grund, warum das Diagramm neu generiert werden muss).

Da ich ein HBase-Anfänger bin, könnte ich vielleicht Zeilen für etwas missbrauchen, dass Spalten besser wären - wenn Sie einen Designvorschlag haben, cool! Oder, vielleicht werden die Diagramme besser in einer Datei generiert (z. B. kein HBase für die Ausgabe)? Ich verwende MapReduce.

    
jbasko 06.01.2011, 19:33
quelle

3 Antworten

7

Erstens, bis zum Punkt der Entfernungslöschung, gibt es in HBase, AFAIK, noch keine Entfernungsentfernung. Aber es gibt eine Möglichkeit, mehr als eine Zeile gleichzeitig im HTableInterface API . Dazu einfach ein Delete-Objekt mit Zeilenschlüsseln aus dem Scan erstellen und in eine Liste stellen und die API verwenden, fertig! Um den Scanvorgang zu beschleunigen, fügen Sie keine Spaltenfamilie in das Suchergebnis ein, da Sie nur den Zeilenschlüssel zum Löschen ganzer Zeilen benötigen.

Zweitens, über das Design. Zuerst verstehe ich die Anforderung, dass es Inhalte mit Inhalts-ID gibt und dass für jeden Inhalt Diagramme generiert werden und diese Daten gespeichert werden. Es kann mehrere Charts pro Inhalt über Daten geben und hängt vom Rang ab. Darüber hinaus möchten wir, dass das zuletzt erstellte Inhaltsdiagramm oben in der Tabelle angezeigt wird.

Für meine Annahme der Anforderung würde ich vorschlagen, drei Tabellen zu verwenden: auto_id, content_charts und generated_order. Der Zeilenschlüssel für content_charts wäre seine Inhalts-ID und der Zeilenschlüssel für generated_order wäre ein long, was automatisch dekrementiert wäre, wenn HTableInterface API . Verwenden Sie zum Dekrementieren '-1' als Betrag, um den Wert Long.MAX_VALUE in der Tabelle 'auto_id' beim ersten Start der App oder manuell zu versetzen und zu initialisieren. Wenn Sie nun die Diagrammdaten löschen möchten, löschen Sie einfach die Spaltenfamilie mit löschen und dann die neuen Daten zurückstellen und dann in die generated_order-Tabelle einfügen. Auf diese Weise wird die letzte Einfügung in der letzten Einfügungstabelle, die die Inhalts-ID als einen Zellenwert enthalten wird, auch ganz oben stehen. Wenn Sie sicherstellen möchten, dass generated_order nur einen Eintrag pro Inhalt hat, speichern Sie zuerst die generated_order-ID, und übernehmen Sie den Wert und speichern Sie ihn in content_charts, wenn Sie vor dem Löschen der Spaltenfamilie die Zeile aus generated_order löschen. Auf diese Weise können Sie nach einem Inhalt suchen und Diagramme erstellen, indem Sie maximal 2 Gets verwenden und für die Diagramme keinen Scan benötigen.

Ich hoffe, das ist hilfreich.

    
imyousuf 07.01.2011, 06:43
quelle
2

Sie können das BulkDeleteProtocol verwenden, das einen Scan verwendet, der den relevanten Bereich definiert (Startzeile, Endzeile, Filter).

Siehe hier

    
Ron Sher 18.02.2014 15:16
quelle
2

Ich bin auf Ihre Situation gestoßen und das ist mein Code, um das zu implementieren, was Sie wollen

%Vor%     
Adelin 07.03.2014 11:46
quelle

Tags und Links