查询操作,不管是关系型数据库,还是非关系型数据库,相对于增删改,都占了很大的比重。
查询不易,且行且珍惜。
使用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();
}
}
}
|