2016-08-11 3 views
3

私は次のように、テキストのIDとタイムスタンプで構成され、行キー、とHBaseのテーブルを持っている:どのようにフィルタ行キーの一部でHBaseのスキャン?

... 
string_id1.1470913344067 
string_id1.1470913345067 
string_id2.1470913344067 
string_id2.1470913345067 
... 

私はいくつかの文字列IDとタイムスタンプとの結果を得るために(スカラまたはJavaで)のHBaseのスキャンをフィルタリングすることができますどのようにいくつかの価値よりも?

おかげ

+0

。あなたは何を望んでいるのか、何を試してみましたか? –

+0

@SarveshKumarSinghたとえば、問題のような4つのキーしかなく、_string_id2_のみでタイムスタンプが_1470913345000_より大きい場合は、最後のキーが1つだけ表示されます –

+0

詳細な説明がありますかあなたの必要と何を試してみましたか?これほど曖昧なことは解決できません。 –

答えて

-1

私はフィルタに使用して私の問題を解決:
- PrefixFilter(私は、行キーのこのフィルタ最初の部分に置く私の場合 - 文字列のID、例えば「string_id1を。」。)
- RowFilter私はそこに2 parametresを置く(:最初の - CompareOp.GREATER_OR_EQUAL、二 - 必要に応じてタイムスタンプを持つすべての私の行キー、例えば「string_id1.1470913345000」

結果では、私は、最初の部分であればstring_id必要があります行キー、とのすべてのセルを取得します2番目の部分でフィルタに入れたものよりも多いか等しいタイムスタンプまさに私が欲しいものです。

コードスニペット:解決策を見つけるために助けたすべての人に

val s = new Scan() 
s.addFamily(family.getBytes) 
val filterList = new FilterList() 
filterList.addFilter(new PrefixFilter(Bytes.toBytes(prefixOfRowKey))) 
filterList.addFilter(new RowFilter(CompareOp.GREATER_OR_EQUAL, new BinaryComparator(valueForBinaryFilter.getBytes()))) 
s.setFilter(filterList) 
val scanner = table.getScanner(s) 

感謝を。

-2

は、あなたが何らかの形で一覧またはRDDのようなモナド一筆書き構造であなたのラインを有することになったとしましょう。今度は、id = "string_id2"timestamp > 1470913345000という文字列だけを使用したいとします。

ここで問題は何ですか?この2つの基準でトラバースできるモナド構造をフィルタリングするだけです。

val filtered = listOrRddOfLines 
    .map(l => { 
    val idStr :: timestampStr :: Nil = l.split('.').toList 
    (idStr, timestampStr.toLong) 
    }) 
    .filter({ 
    case (idStr, timestamp) => idStr.equals("string_id2") && (timestamp > "1470913345000".toLong) 
    }) 
+0

いいえ、あなたはわかりません。私はHBaseにそのようなリクエストを作成する必要があります。これは私に必要な結果を返します。しかし、あなたの実装を使用する場合、私はHBaseテーブルからすべてのデータをアップロードし、その後それをフィルタリングする必要があります。それは私の意見ではあまり良い解決策ではない –

+0

私は私のコメントで言ったように。私はあなたの要件を理解できませんでした。 –

3

ファジー行アプローチは要件のこの種のために効率的であり、データがある場合に巨大である: このarticle により説明したようにFuzzyRowFilterパラメータ行キーとマスク情報として取ります。上記の例で

、場合我々は最後検索するには、ユーザーログイン、行キーフォーマットがuserId_actionId_timestampある(userId言う4文字の長さを固定した場合)、我々が探しているファジー行キーが????_login_あります。これはFuzzyRowKeyのため、次ののparamsに変換:

FuzzyRowFilter rowFilter = new FuzzyRowFilter(
Arrays.asList(
    new Pair<byte[], byte[]>(
    Bytes.toBytesBinary("\x00\x00\x00\x00_login_"), 
    new byte[] {1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0}))); 

はHBaseの-決定的なガイドを通過することをお勧め - あなたが得るために何をしたいです>Client API: Advanced Features

関連する問題