1

(javaからの)HBaseテーブルがあり、キーのリストでテーブルをクエリしたいと思います。私は次のことをしましたが、うまくいきませんでした。

mFilterFeatureIt = mFeatureSet.iterator();
FilterList filterList=new FilterList(FilterList.Operator.MUST_PASS_ONE);

while (mFilterFeatureIt.hasNext()) {
    long myfeatureId = mFilterFeatureIt.next();
System.out.println("FeatureId:"+myfeatureId+" , ");
RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) );
filterList.addFilter(filter);
}

outputMap  = HbaseUtils.getHbaseData("mytable", filterList);
System.out.println("Size of outputMap map:"+ outputMap.szie());

public static Map<String, Map<String, String>> getHbaseData(String table, FilterList filter) {

    Map<String, Map<String, String>> data = new HashMap<String, Map<String, String>>();
HTable htable = null;
try {
    htable = new HTable(HTableConfiguration.getHTableConfiguration(),table);
    Scan scan = new Scan();
    scan.setFilter(filter);

    ResultScanner resultScanner = htable.getScanner(scan);
    Iterator<Result> results = resultScanner.iterator();

    while (results.hasNext()) {

    Result result = results.next();
    String rowId = Bytes.toString(result.getRow());
    List<KeyValue> columns = result.list();
    if (null != columns) {

    HashMap<String, String> colData = new HashMap<String, String>();
    for (KeyValue column : columns) {
        colData.put(Bytes.toString(column.getFamily()) + ":"+ Bytes.toString(column.getQualifier()),Bytes.toString(column.getValue()));
    }
                data.put(rowId, colData);
    }

    }

    } catch (IOException e) {
    e.printStackTrace();
    } finally {
        if (htable != null)
    try {
    htable.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    return data;
}

FeatureId:80515900、FeatureId:80515901、FeatureId:80515902、

outputMapマップのサイズ:0

機能IDの値が必要なものであることがわかりますが、キーがhbaseテーブルに存在する場合でも、常に上記の出力が得られます。誰かが私が間違っていることを教えてもらえますか?

編集:hbase utilメソッドのコードを上に投稿したので、そこにあるバグを指摘できます。

私はselect * FROM mytable where featureId in (80515900, 80515901, 80515902)、HBaseで同じことを実現するために、SQLと同等の機能を実行しようとしています。これは、featureIdごとに1つのフィルターを使用してフィルターリストを作成することでした。あれは正しいですか ?

これが私のテーブルの内容です

scan 'mytable', {COLUMNS => ['sample:tag_count'] }

80515900                                            column=sample:tag_count, timestamp=1339304052748, value=4                                                                                                
80515901                                            column=sample:tag_count, timestamp=1339304052748, value=0                                                                                                
80515902                                            column=sample:tag_count, timestamp=1339304052748, value=3       
80515903                                            column=sample:tag_count, timestamp=1339304052748, value=1                                                                                                
80515904                                            column=sample:tag_count, timestamp=1339304052748, value=2                                                                                                
4

2 に答える 2

3

データをhbaseに挿入している間、
キーのデータ型は(スキャン結果から)「文字列」であり、フェッチ中にRowFilterに渡された値は「長い」データ型であるため、データは返されません。このフィルタを使用します:

RowFilter filter = new RowFilter(CompareOp.EQUAL,new    
BinaryComparator(Bytes.toBytes(myfeatureId.toString())) );
于 2012-06-19T13:28:34.047 に答える
0

while ループは常に新しいフィルターを生成し、フィルター リストに追加します。

回路はフィルターのすべてのキーです。このフィルターは、単一の行には適用できません。while ループで、既知の "myfeatureId" を指すフィルターを 1 つだけ作成します。

while (mFilterFeatureIt.hasNext()) {
    long myfeatureId = mFilterFeatureIt.next();
System.out.println("FeatureId:"+myfeatureId+" , ");
if ( myfeatureId=="80515902") {
     RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) );
     filterList.addFilter(filter);
     }
}

編集

行数については、クエリが責任を負います。HBase はありません

HBase フィルター

フィルターは、行選択基準を HBase にプッシュします。行は、リモートで並行してフィルタリングできます。これらの関数を使用すると、不要な行をクライアントに送信することを回避できます。

キーの一部を取得するには、80515900 .. 80515909 からすべてを取得します。これを試してください

もちろんループから外す

RowFilter filter = new RowFilter(CompareOp.EQUAL,new BinaryComparator(Bytes.toBytes(myfeatureId)) );
filterList.addFilter(filter);

行の上に追加しますoutputMap = HbaseUtils.getHbaseData("mytable", filterList);

....
RowFilter filter = new RowFilter(CompareOp.EQUAL,new SubStringComparator("8051590"));
filterList.addFilter(filter);
outputMap  = HbaseUtils.getHbaseData("mytable", filterList);
于 2012-06-10T21:58:28.333 に答える