java - Hbase Java API : Retrieving all rows that match a Partial Row Key

标签 java hbase

在 Python 模块中 happybase ,我可以检索具有以给定字符串开头的行键的所有行(即,使用部分行键进行搜索)。

假设我有一个格式为 (ID|TYPE|DATE) 的 rowkey,我可以通过以下方式找到 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 操作,因此您只会返回一行(请注意,您也可以在此处指定前缀,而不必提供完整的键)

如果你想取回多行你应该使用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);

关于java - Hbase Java API : Retrieving all rows that match a Partial Row Key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842469/

相关文章:

java - 输入数字 n,然后打印 1 到 n 之间的所有偶数方 block

hadoop - Hbase 自动递增任何列/行键

hadoop - HBase MapReduce ,多表操作

java - 紧凑型映射器零件文件

java - 如何使用Java API从hbase中的表中选择特定列

Java NullPointerException - 我可以告诉空对象的类吗?

java - 如何旋转矩形?

java - java中使用Scrollbar改变颜色

java - 递归方法是否允许创建多个同名变量?

api - 获取opentsdb中所有标签的指标的最新/最新值