Hbase Java API: Abrufen aller Zeilen, die einem Teilzeilenschlüssel entsprechen

Im Python-Modulhappybase, Ich kann alle Zeilen mit einem Zeilenschlüssel abrufen, der mit einer bestimmten Zeichenfolge beginnt (d. H. Mit einem Teil-Zeilenschlüssel suchen).

Angenommen, ich habe einen Zeilenschlüssel im Format (ID | TYPE | DATE). Ich könnte alle Zeilen mit einer ID von 1 und einem TYPE von A folgendermaßen finden:

import happybase
connection = happybase.Connection('hmaster-host.com')
table = connection.table('table_name')
for key, data in table.scan(row_prefix="1|A|"):
    print key, data

Dies ist, was ich bis jetzt als Java-Programm auf Client-Seite für jeden habe, der versucht, die Grundlagen mit dem zu machenJava HBase APIIch kann aber nur mit dem vollständigen Zeilenschlüssel nach einer Zeile suchen:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.util.Bytes;
//class foo {
public static void main(String[] args) {
    Configuration conf = new Configuration();
    conf.addResource(new Path("C:\\core-site.xml"));
    conf.addResource(new Path("C:\\hbase-site.xml"));
    HTable table = new HTable(conf, "table_name");
    Result row = table.get(new Get(Bytes.toBytes("1|A|2014-01-01 00:00")));
    printRow(row); 
}
public static void printRow(Result result) {
    String returnString = "";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("id"))) + ", ";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("type"))) + ", ";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("date")));
    System.out.println(returnString);
}
//}

Wobei "cf" der Name der Spaltenfamilie ist.

ANTWORTEN:
import java.io.IOException;
import java.util.Iterator;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
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.Filter;
import org.apache.hadoop.hbase.filter.PrefixFilter;
import org.apache.hadoop.hbase.util.Bytes;
//class foo {
public static void main(String[] args) {
    Configuration conf = new Configuration();
    conf.addResource(new Path("C:\\core-site.xml"));
    conf.addResource(new Path("C:\\hbase-site.xml"));
    HTable table = new HTable(conf, "table_name");
    byte[] prefix = Bytes.toBytes("1|A|");
    Scan scan = new Scan(prefix);
    Filter prefixFilter = new PrefixFilter(prefix);
    scan.setFilter(prefixFilter);
    ResultScanner resultScanner = table.getScanner(scan);
    printRows(resultScanner);
    //Result row = table.get(new Get(Bytes.toBytes("1|A|2014-01-01 00:00")));
    //printRow(row); 
}
public static void printRows(ResultScanner resultScanner) {
    for (Iterator<Result> iterator = results.iterator(); iterator.hasNext();) {
        printRow(iterator.next();
    }
}
public static void printRow(Result result) {
    String returnString = "";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("id"))) + ", ";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("type"))) + ", ";
    returnString += Bytes.toString(result.getValue(Bytes.toBytes("cf"), Bytes.toBytes("date")));
    System.out.println(returnString);
}
//}

Beachten Sie, dass ich das verwendesetFilter Methode, während die Antwort unten verwendet dieaddFilter Methode, aufgrund von uns mit verschiedenen APIs.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage