2012-06-17 7 views
6

いくつかのフィルタを適用した後、HBaseの行に選択した列を取得しようとしています。HBaseでフィルタリングされた行を取得

ENAME:FNAMEのENAME:LNAMEの給与:給与総額:ダ給与:

taの私は私が持っている。このため、総給与> 1500を持つすべての従業員のリストを取得したいのようなテーブルを考えてみましょう次のコードを書いてください。私が直面している問題は、私が列をフィルタリングするときに、出力ではそのフィルタのみが得られるということです。なぜなら、それは作成されたものなのですが、目的の列を取得したいが、特定の列、私は今述べたような - 次の列のセットであるべき給与> 1500

出力を持つすべての従業員のリスト:

LNAME、FNAME、給与:グロス、給与:

TA

コードこれまでのコード

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.KeyValue; 
import org.apache.hadoop.hbase.client.Get; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.client.ResultScanner; 
import org.apache.hadoop.hbase.client.Scan; 
import org.apache.hadoop.hbase.filter.BinaryComparator; 
import org.apache.hadoop.hbase.filter.RegexStringComparator; 
import org.apache.hadoop.hbase.filter.SubstringComparator; 
import org.apache.hadoop.hbase.filter.CompareFilter; 
import org.apache.hadoop.hbase.filter.Filter; 
import org.apache.hadoop.hbase.filter.QualifierFilter; 
import org.apache.hadoop.hbase.filter.FamilyFilter; 
import org.apache.hadoop.hbase.filter.FilterList; 
import org.apache.hadoop.hbase.filter.ValueFilter; 
import org.apache.hadoop.hbase.util.Bytes; 


import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 


public class MyQualifierFilterExample { 

    public static void main(String[] args) throws IOException { 
    Configuration conf = HBaseConfiguration.create(); 

    HTable table = new HTable(conf, "emp"); 

    List<Filter> filters = new ArrayList<Filter>(); 

    Filter famFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, 
       new BinaryComparator(Bytes.toBytes("salary"))); 
    filters.add(famFilter); 

    Filter colFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, 
     new BinaryComparator(Bytes.toBytes("gross"))); 

    filters.add(colFilter); 

    Filter valFilter = new ValueFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, 
       new BinaryComparator(Bytes.toBytes("1500"))); 

    filters.add(valFilter); 

    FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); 


    Scan scan = new Scan(); 
    scan.setFilter(fl); 
    ResultScanner scanner = table.getScanner(scan); 
    System.out.println("Scanning table... "); 
    for (Result result : scanner) { 
     //System.out.println("getRow:"+Bytes.toString(result.getRow())); 
     for (KeyValue kv : result.raw()) { 
      //System.out.println("Family - "+Bytes.toString(kv.getFamily())); 
      //System.out.println("Qualifier - "+Bytes.toString(kv.getQualifier())); 
      System.out.println("kv:"+kv +", Key: " + Bytes.toString(kv.getRow()) + ", Value: " +Bytes.toString(kv.getValue())); 
     } 
    } 

    scanner.close(); 
    System.out.println("Completed "); 
    } 
} 

出力

Scanning table... 
kv:101/salary:gross/1339876269770/Put/vlen=4, Key: 101, Value: 2000 
kv:102/salary:gross/1339876277659/Put/vlen=4, Key: 102, Value: 2400 
kv:105/salary:gross/1339876300585/Put/vlen=4, Key: 105, Value: 2300 
kv:106/salary:gross/1339876310004/Put/vlen=4, Key: 106, Value: 2900 
Completed 

ソリューション1

import org.apache.hadoop.conf.Configuration; 
import org.apache.hadoop.hbase.HBaseConfiguration; 
import org.apache.hadoop.hbase.KeyValue; 
import org.apache.hadoop.hbase.client.Get; 
import org.apache.hadoop.hbase.client.HTable; 
import org.apache.hadoop.hbase.client.Result; 
import org.apache.hadoop.hbase.client.ResultScanner; 
import org.apache.hadoop.hbase.client.Scan; 
import org.apache.hadoop.hbase.filter.BinaryComparator; 
import org.apache.hadoop.hbase.filter.RegexStringComparator; 
import org.apache.hadoop.hbase.filter.SubstringComparator; 
import org.apache.hadoop.hbase.filter.CompareFilter; 
import org.apache.hadoop.hbase.filter.Filter; 
import org.apache.hadoop.hbase.filter.QualifierFilter; 
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; 
import org.apache.hadoop.hbase.filter.FamilyFilter; 
import org.apache.hadoop.hbase.filter.FilterList; 
import org.apache.hadoop.hbase.filter.ValueFilter; 
import org.apache.hadoop.hbase.util.Bytes; 


import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 


public class MyQualifierFilterExample { 

    public static void main(String[] args) throws IOException { 
    Configuration conf = HBaseConfiguration.create(); 

    HTable table = new HTable(conf, "emp"); 

    List<Filter> filters = new ArrayList<Filter>(); 

    SingleColumnValueFilter colValFilter = new SingleColumnValueFilter(Bytes.toBytes("salary"), Bytes.toBytes("gross") 
      , CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("1300"))); 
    colValFilter.setFilterIfMissing(false); 
    filters.add(colValFilter);   

    Filter colValFilter2 = new SingleColumnValueFilter(Bytes.toBytes("salary"), Bytes.toBytes("da") 
      , CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("150"))); 
    filters.add(colValFilter2); 

    //Filter colValFilter3 = new SingleColumnValueFilter(Bytes.toBytes("ename"), Bytes.toBytes("fname") 
    //  , CompareFilter.CompareOp.GREATER_OR_EQUAL, new SubstringComparator("jack")); 
    //filters.add(colValFilter3); 

    FilterList fl = new FilterList(FilterList.Operator.MUST_PASS_ALL, filters); 


    Scan scan = new Scan(); 
    scan.setFilter(fl); 
    scan.addColumn(Bytes.toBytes("ename"), Bytes.toBytes("fname")); 
    scan.addColumn(Bytes.toBytes("ename"), Bytes.toBytes("lname")); 
    scan.addColumn(Bytes.toBytes("salary"), Bytes.toBytes("gross")); 
    scan.addColumn(Bytes.toBytes("salary"), Bytes.toBytes("da")); 

    ResultScanner scanner = table.getScanner(scan); 
    String key = new String("~"); 
    String keyFlag = new String("~"); 
    System.out.println("Scanning table... "); 
    for (Result result : scanner) { 
     //System.out.println("getRow:"+Bytes.toString(result.getRow())); 
     key = "~"; 
     for (KeyValue kv : result.raw()) { 

      if (key.compareTo(keyFlag)==0) 
      { 
       key = Bytes.toString(kv.getRow()); 
       System.out.print("Key: " + key); 
      } 
      //System.out.print("Family - "+Bytes.toString(kv.getFamily())); 

      //System.out.print(", Buffer - "+Bytes.toString(kv.getBuffer())); 
      //System.out.print(", FamilyOffset - " + kv.getFamilyOffset()); 
      System.out.print(", "+Bytes.toString(kv.getFamily())+"."+Bytes.toString(kv.getQualifier())); 
      System.out.print("=" +Bytes.toString(kv.getValue())); 
     } 
     System.out.println(""); 
     System.out.println("-------------------"); 
    } 

    scanner.close(); 
    System.out.println("Completed "); 
    } 
} 

出力:

Scanning table... 
Key: 103, ename.fname=peter, ename.lname=parker, salary.da=190, salary.gross=1400 
------------------- 
Key: 105, ename.fname=harry, ename.lname=potter, salary.da=154, salary.gross=2300 
------------------- 
Completed 
+0

あなたの給料は本当に表すバイトとして保存されます文字列?これは文字列 '' 900 ''が文字列' '1500" 'よりも大きいので問題になるかもしれません。 – kichik

答えて

0

ValueFilter このフィルタは、特定の値

を持つ列のみを含めることが可能となります

これは、フィルタで指定した列のみを取得するためです。

私が間違っているかどうか教えてください。しかし、あなたがしたいことは、給与が1500を超えるときにすべての列を取得することです。

0

あなたの要件はリレーショナルです。だから、私はHBase上のラッパーを使用して簡単に生活をすることをお勧めします。

Apache Phoenixを使用することを検討してください。これはHBase用の高性能SQLラッパーで、select * from emp where salary>1500のようなクエリを実行できます。

あなたが SingleColumnValueFilteraddFamily(またはAddColumn関数)の組み合わせを使用する必要があります
1

(私はこの時点で私の側でそれをテストすることはできません)、以下を参照してください:

SingleColumnValueFilter filter = new SingleColumnValueFilter(
    Bytes.toBytes("salary"), 
    Bytes.toBytes("gross"), 
    CompareOp.GREATER, 
    Bytes.toBytes("1500") 
); 
//To prevent the entire row from being emitted 
//if the column is not found on a row 
scan.setFilterIfMissing(true) 
scan.setFilter(filter); 

scan.addFamily(Bytes.toBytes("ename")) 
scan.addColumn(Bytes.toBytes("salary"), Bytes.toBytes("da")) 
scan.addColumn(Bytes.toBytes("salary"), Bytes.toBytes("gross")) 
関連する問題