Pythonモジュール happybase )では、指定された文字列で始まる行キーを持つすべての行を取得できます(つまり、部分的な行キーを使用して検索します)。
(ID | TYPE | DATE)の形式の行キーがあるとすると、IDが1でTYPEがAのすべての行を次のように見つけることができます。
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
これは、完全にクライアント側のJavaプログラムで、 Java HBase API を使用して基本を実行しようとしている人のためのものですが、検索できるのは全行キーを使用した行:
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);
}
//}
ここで、「cf」は列ファミリーの名前です。
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);
}
//}
私はsetFilter
メソッドを使用しているのに対し、以下の回答ではaddFilter
メソッドを使用していることに注意してください。これは、さまざまなAPIを使用しているためです。
HTable get
操作を使用しているため、1行しか返されません(ここでもプレフィックスを指定でき、完全なキーを指定する必要はありません)。
複数の行を取り戻したい場合は、Scan
を使用する必要があります
byte[] prefix=Bytes.toBytes("1|A|");
Scan scan = new Scan(prefix);
PrefixFilter prefixFilter = new PrefixFilter(prefix);
scan.addFilter(prefixFilter);
ResultScanner resultScanner = table.getScanner(scan);