38

列ファミリー(つまり、Tweet)が特定の値(つまり、user_id)を持つhbaseシェルからHTableの行をスキャンしたいと思います。

test1ここで、この列に値があるため、tweet:user_idに値があるすべての行を検索します。'test1'

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

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

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

しかし、行をスキャンして値を探す方法が見つかりませんでした。

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

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

4

7 に答える 7

49

ハイブなしで可能です:

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

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

于 2012-09-25T21:05:57.970 に答える
28

ニシュ、これが私が定期的に使っている解決策です。実際には今必要なものよりはるかに強力ですが、いつかその力を使うことになると思います。はい、HBaseシェル用です。

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フィルタが適用された列のみが返されます。このフィルターは、より複雑な比較を実行するように改善できます。

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

于 2013-10-03T10:15:58.920 に答える
15

この回答を説明するための複数のリクエストがあったため、この追加の回答が投稿されました。

例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
于 2016-04-12T22:30:58.567 に答える
8

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内のすべてのオカレンスが表示されます。

于 2015-02-18T16:28:02.680 に答える
1

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

scan 'tablename' ,
   { 
     FILTER => "SingleColumnValueFilter('column_family','col_name',>, 'binary:1')" 
   } 
于 2013-12-17T12:55:40.187 に答える
0

HBAseシェルからは、特定のデータを検索するために使用するクエリに似ているため、不可能だと思います。HBAseはnoSQLであることがわかっているので、クエリを適用する場合、またはあなたのような場合は、HiveまたはPIGを使用する必要があります。PIGではスクリプトをいじる必要があるため、Hiveは静かで良いアプローチです。とにかく、ここからHIVEとHBaseとの統合と
ここからハイブについての良い保証を得ることができますあなたが (任意のクライアントの)コードから取得しないようにデータを表示することだけが目的である場合は、HBase Explorerまたは新しくて非常に優れた製品を使用できますが、ベータリリースには「HBaseマネージャー」があります。これはHBaseManagerから入手できます

そのシンプルで、さらに重要なことに、他のDBclientsのようにUIから列修飾子にフィルターを適用して、データを挿入および削除するのに役立ちます。試してみてください。
お役に立てば幸いです:)

于 2012-06-13T12:38:14.760 に答える
0

少し異なる質問ですが、すべての行に存在しない特定の列をクエリする場合DependentColumnFilterは、親友です。

import org.apache.hadoop.hbase.filter.DependentColumnFilter
scan 'orgtable2', {FILTER => "DependentColumnFilter('cf1','lan',false,=,'binary:fre')"}

lan前のスキャンでは、列が存在し、関連する値がに等しい行のすべての列が返さ れfreます。3番目の引数はdropDependentColumn、にlan設定されている場合、列自体が結果に表示されないようにすることtrueです。

于 2020-10-07T19:51:13.200 に答える