[hbase]使用HBase的Java api查询HBase,
查询操作,不管是关系型数据库,还是非关系型数据库,相对于增删改,都占了很大的比重。
查询不易,且行且珍惜。
使用HBase的java api来进行查询,主要有两种方式,一种是直接通过rowkey(类似于主键)来查询;另一种是scan,扫描表(扫描某一列族,扫描某一colume,以rowkey的开始和结束做为一个范围进行扫描)
1、通过rowkey来查询一条记录
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
//根据rowkey查询一条记录
public
void queryByRowKey(Configuration conf,String tableName,String rowKey){
HTable
hTable = null;
try
{
hTable
=new
HTable(conf, tableName);
Get
get =new
Get( rowKey.getBytes());
Result
result = hTable.get(get);
System.err.println("rowkey为:"
+ rowKey);
HashMap<String,
String> hm =new
HashMap<String, String>();
for
(KeyValue kv: result.raw()) {
hm.put(new
String(kv.getFamily()) ,new
String(kv.getValue()));
System.err.println("rowkey:"
+new
String(kv.getKey()));
System.err.println("-------------------------------");
System.err.println("columnFamily:"
+new
String(kv.getFamily()) +"===column:"
+new
String(kv.getQualifier()) +"===getValue:"
+new
String(kv.getValue()));
}
System.err.println(hm.size());
System.err.println(hm.toString());
}catch
(IOException e) {
e.printStackTrace();
}finally
{
try
{
hTable.close();
}catch
(IOException e) {
e.printStackTrace();
}
}
}
|
2、扫描整个表
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//扫描hbase表,获取所有记录
public
void getAllRow(Configuration conf, String tableName){
HTable
hTable = null;
ResultScanner
rs = null;
try
{
hTable
=new
HTable(conf,"DANIU");
rs
= hTable.getScanner(new
Scan());
//循环rowkey
for
(Result result : rs) {
for
(KeyValue kv : result.raw()) {
System.err.println("rowkey:"
+new
String(kv.getKey()));
System.err.println("-------------------------------");
System.err.println("columnFamily:"
+new
String(kv.getFamily()) +"===column:"
+new
String(kv.getQualifier()) +"===getValue:"
+new
String(kv.getValue()));
}
}
}catch
(IOException e) {
e.printStackTrace();
}finally{
rs.close();
try
{
hTable.close();
}catch
(IOException e) {
e.printStackTrace();
}
}
}
|
3、根据一个条件,扫描。使用一个filter
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
//根据查询多条记录,一个filter的使用
public
void filterSingleColumnValueFilter(Configuration conf,String tableName){
HTable
hTable = null;
ResultScanner
rs = null;
try
{
hTable
=new
HTable(conf, tableName);
Filter
filter =new
SingleColumnValueFilter("columnfamily1".getBytes(),
null, CompareOp.EQUAL,"value1".getBytes());
Scan
scan =new
Scan();
scan.setFilter(filter);
rs
= hTable.getScanner(scan);
for
(Result result : rs) {
for
(KeyValue kv : result.raw()) {
System.err.println("rowkey:"
+new
String(kv.getKey()));
System.err.println("-------------------------------");
System.err.println("columnFamily:"
+new
String(kv.getFamily()) +"===column:"
+new
String(kv.getQualifier()) +"===getValue:"
+new
String(kv.getValue()));
}
}
}catch
(IOException e) {
e.printStackTrace();
}finally{
rs.close();
try
{
hTable.close();
}catch
(IOException e) {
e.printStackTrace();
}
}
}
|
4、使用多个条件来查询数据。多个filter的使用。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
//更多条件,查询更多数据,多个filter的使用。
public
void filterMore(Configuration conf,String tableName){
HTable
hTable = null;
ResultScanner
rs = null;
try
{
hTable
=new
HTable(conf, tableName);
List<Filter>
filters =new
ArrayList<Filter>();
Filter
filter1 =new
SingleColumnValueFilter("columnfamily1".getBytes(),
null, CompareOp.EQUAL,"value1".getBytes());
filters.add(filter1);
Filter
filter2 =new
SingleColumnValueFilter("columnfamily2".getBytes(),
null, CompareOp.EQUAL,"value2".getBytes());
filters.add(filter2);
//还可以添加更多的filter
Scan
scan =new
Scan();
rs
= hTable.getScanner(scan);
for
(Result result : rs) {
for
(KeyValue kv : result.raw()) {
System.err.println("rowkey:"
+new
String(kv.getKey()));
System.err.println("-------------------------------");
System.err.println("columnFamily:"
+new
String(kv.getFamily()) +"===column:"
+new
String(kv.getQualifier()) +"===getValue:"
+new
String(kv.getValue()));
}
}
}catch
(IOException e) {
e.printStackTrace();
}finally{
rs.close();
try
{
hTable.close();
}catch
(IOException e) {
e.printStackTrace();
}
}
}
|
本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.
同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。