2013-07-09 7 views
21

Ich entwerfe eine App auf hbase laufen und möchte den Inhalt meines Clusters interaktiv erkunden. Ich bin in der HBase-Shell und ich möchte einen Scan aller Schlüssel beginnend mit den Zeichen "abc" durchführen. Solche Schlüssel könnte „ABC4“, „abc92“, „abc20014“ etc inlcude ... habe ich versucht, einen ScanHBase (einfach): Wie führe ich Range-Präfix-Scan in HBase-Shell

hbase(main):003:0> scan 'mytable', {STARTROW => 'abc', ENDROW => 'abc'} 

Aber dies scheint nicht, etwas zurück, da es nur rowkeys technisch keine RowKey „abc“ beginnen mit „abc“

Was ich möchte so etwas wie

hbase(main):003:0> scan 'mytable', {STARTSROWPREFIX => 'abc', ENDROWPREFIX => 'abc'} 

ich höre HBase dies schnell tun können, und ist eines seiner wichtigsten Verkaufsargumente. Wie mache ich das in der HBase Shell?

Vielen Dank im Voraus.

Antwort

39

aufgeführt sind, so stellt sich heraus, sehr einfach zu sein. Die Scan-Bereiche sind nicht inklusive, die Logik ist Start < = Schlüssel < Ende. Die Antwort ist also

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'} 
+0

Das stimmt - sieht so aus als hättest du es auf die harte Tour gefunden. :) Möchten Sie dies als die richtige Antwort markieren? – Suman

+0

aber hbase doc sollte sagen, dass starrow tatsächlich starrowrowprefix – nir

+2

Wenn Ihre Zeilen nur 'ASCII' Werte verwenden, dann ist es so einfach wie Sie hier beschreiben. Wenn Sie wirklich binäre Zeilenschlüssel verwenden, wird es viel schwieriger. Überprüfen Sie hier https://issues.apache.org/jira/browse/HBASE-11990, um zu sehen, welche Diskussion und Edge Cases versuchen, eine generische Lösung ans Licht zu bringen. –

1

Ich denke, was Sie brauchen, ist ein Filter

Kasse die Antwort für Frage folgende Scan with filter using HBase shell

mehr Filter in http://hbase.apache.org/book/client.filter.html

+0

Ich bin unter dem Eindruck, Filter sind viel langsamer, dass Bereich Scans. http://stackoverflow.com/questions/10942638/should-ususer-prefixfilter-or-rowkey-range-scan-in-hbase. Gibt es eine Möglichkeit, dies mit einem Entfernungsscan zu tun? –

+1

@DavidWilliams: Ja, Bereichsabfragen sind schneller. – Tariq

18

Die akzeptierte Lösung wird in allen Fällen nicht funktionieren (binary-Tasten). Darüber hinaus kann die Verwendung eines Präfixfilters langsam sein, da ein Tabellenscan durchgeführt wird, bis das Präfix erreicht ist. Eine leistungsfähigere Lösung ist ein StartRow und ein Filter wie so verwenden:

scan 'my_table', {STARTROW => 'abc', FILTER => "PrefixFilter('abc')"} 
+0

Ich habe Probleme, den Zweck des 'PrefixFilters' zu verstehen, wenn' starrow' und 'stoprow' überlegen zu sein scheinen. Kennen Sie irgendwelche Anwendungsfälle? Ich habe auch gehört, dass Leute alle drei kombinieren. –

+0

Das ist die Lösung, die für mich funktioniert hat. Mein Schlüssel besteht aus AAA_B_CCC. Ich brauchte alle Zeilen, in denen der Schlüssel mit AAA_ gestartet wurde. –

17

In den letzten Versionen von HBase können Sie jetzt in der hbase Shell tun:

scan 'mytable', {ROWPREFIXFILTER => 'abc'} 
Diese

effektiv tut dies (und auch arbeitet für binäre Situationen)

scan 'mytable', {STARTROW => 'abc', ENDROW => 'abd'} 

dieses Verfahren viel effizienter als die „PrefixFilter“ -Ansatz ist, weil die letztere legt alle Datensätze durch den Vergleichscode der in diesem Prefi ist xFilter-Klasse

+1

Ich habe Probleme, den Zweck des PrefixFilter zu verstehen, wenn Starrow und Stoprow als überlegen erscheinen. Kennen Sie irgendwelche Anwendungsfälle? Ich habe auch gehört, dass Leute alle drei kombinieren. –

+0

Ich benutze den PrefixFilter überhaupt nicht mehr. Vielleicht gibt es einen guten Grund, es zu benutzen, wenn man etwas in einem Coprozessor macht, sonst würde ich sogar dafür stimmen, die Klasse von HBase insgesamt zu entfernen. –

+0

Leider habe ich es die ganze Zeit benutzt, weil ich fälschlicherweise angenommen habe, dass Sie eine genaue Übereinstimmung in den Start- und Endzeilen benötigen. Ich habe einen Test auf 5 Millionen Zeilen durchgeführt, die auf 26 verschiedene Zeilenschlüssel-Präfixe verteilt sind, und der Präfix-Filter ist für mich durchschnittlich 300% langsamer. Jetzt verbringe ich meinen Samstag damit, alle meine Jobs zu refaktorieren :) –