web-dev-qa-db-ja.com

HBaseシェルを使用して特定の列値のHTable行をスキャンします

hbase ShellからHTableの行をスキャンしたい場合、列ファミリー(つまり、ツイート)には特定の値(つまり、user_id)があります。

この列の値がtest1であるため、Tweet:user_idの値が'test1'であるすべての行を検索したい

column=Tweet:user_id, timestamp=1339581201187, value=test1

特定の用途でテーブルをスキャンできますが、

scan 'tweetsTable',{COLUMNS => 'Tweet:user_id'}

しかし、行の値をスキャンする方法を見つけられませんでした。

HBase Shellを介してこれを行うことは可能ですか?

この質問 もチェックしました。

33
Nishu Tayal

Hiveなしでも可能です。

scan 'filemetadata', 
     { COLUMNS => 'colFam:colQualifier', 
       LIMIT => 10, 
       FILTER => "ValueFilter( =, 'binaryprefix:<someValue.e.g. test1 AsDefinedInQuestion>' )" 
     }

注:質問で指定された値としてtest1を含むすべての行を検索するには、binaryprefix:test1を使用しますフィルター内(詳細については この回答 を参照)

43
stu s

Nishu、私が定期的に使用するソリューションです。それは実際にあなたが今必要としているよりもはるかに強力ですが、私はいつかその力を使うと思います。はい、HBase Shell用です。

import org.Apache.hadoop.hbase.filter.CompareFilter
import org.Apache.hadoop.hbase.filter.SingleColumnValueFilter
import org.Apache.hadoop.hbase.filter.SubstringComparator
import org.Apache.hadoop.hbase.util.Bytes

scan 'yourTable', {LIMIT => 10, FILTER => SingleColumnValueFilter.new(Bytes.toBytes('family'), Bytes.toBytes('field'), CompareFilter::CompareOp.valueOf('EQUAL'), Bytes.toBytes('AAA')), COLUMNS => 'family:field' }

フィルターが適用されたfamily:field列のみが返されます。このフィルターを改善して、より複雑な比較を実行できます。

ここに、私が最も役立つと思うヒントもあります。

22

説明するための複数の要求があったので この答え この追加の答えが投稿されました。

例1

もし

scan '<table>', { COLUMNS => '<column>', LIMIT => 3 }

戻ります:

ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3

次に、このフィルター:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter( =, 'binaryprefix:hello_value2') AND ValueFilter( =, 'binaryprefix:hello_value3')" }

戻ります:

ROW     COLUMN+CELL
ROW2    column=<column>, timestamp=<timestamp>, value=hello_value2
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3

例2

サポートされていない場合もサポートされています:

scan '<table>', { COLUMNS => '<column>', LIMIT => 3, FILTER => "ValueFilter( !=, 'binaryprefix:hello_value2' )" }

戻ります:

ROW     COLUMN+CELL
ROW1    column=<column>, timestamp=<timestamp>, value=hello_value
ROW3    column=<column>, timestamp=<timestamp>, value=hello_value3
12
030

D:a_contentの列ファミリを持つテーブルt1の値BIGBLUEのテキスト検索の例。テーブルをスキャンすると、使用可能なすべての値が表示されます。

scan 't1'
...
column=d:a_content, timestamp=1404399246216, value=BIGBLUE
...

制限1のBIGBLUEの値だけを検索するには、以下のコマンドを試してください:-

scan 't1',{ COLUMNS => 'd:a_content', LIMIT => 1, FILTER => "ValueFilter( =, 'regexstring:BIGBLUE' )" }

COLUMN+CELL
column=d:a_content, timestamp=1404399246216, value=BIGBLUE

明らかに制限を削除すると、そのテーブル/ cf内のすべての出現が表示されます。

6
John Cooper

任意の列値に基づいてhbaseのテーブルをスキャンするには、SingleColumnValueFilterを次のように使用できます。

scan 'tablename' ,
   { 
     FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" 
   } 
1
Rahul

HBAse Shellからは、特定のデータを検索するために使用するクエリに似ているため、それは不可能だと思います。 HBAseはnoSQLであることがわかっているので、クエリを適用する場合、またはあなたのようなケースがある場合は、HiveまたはPIGを使用する必要があります。
とにかくここから HBaseとのHiveの統合 および Here からHiveについて十分な信頼を得ることができます
(クライアントの)コードから取得しないデータを表示することだけが目的の場合は、HBase Explorerまたは新しい非常に優れた製品を使用できますが、ベータリリースでは「HBaseマネージャー」です。これは HBase Manager から取得できます
シンプルで、さらに重要なことは、他のDBclientのようにUIから列修飾子にフィルターを適用して、データを挿入および削除するのに役立ちます。試してみてください。
あなたの役に立つことを願っています:)

0
khan