文章目錄
- HBase 過濾器 Java API
- 在IDEA中匯入Maven依賴
- 批量插入學生表stu資料
- 代碼封裝
- 定義全域變數
- 定義全域方法 執行掃描操作
- 遍歷掃描的資料 (所有行)
- 使用CellUtil進行列印
- 建立連接
- 關閉連接
- 過濾器
- 過濾出Rowkey(id)中,包含8的學生資訊
- 過濾出stu表列簇名為info下的所有列的資料
- stu表中列名包含a的所有列的資料,使用正則運算式
- 過濾出 資料中包含 文 的所有資料
- 過濾出 資料中包含 文 的所有資料
- 過濾出班級是 文科班 的學生的所有資訊
- 過濾出班級是 文科班 的學生的所有資訊,最終結果沒有 clazz 列
- 過濾出年齡是 奇數 的學生的所有資訊
- 查詢以150010008開頭的所有前綴的rowkey
- ```多過濾器綜合查詢```
- 過濾出 理科班 中的 女生 年齡為奇數 的所有資訊
- ```完整代碼```
HBase 過濾器 Java API
在IDEA中匯入Maven依賴
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-server</artifactId>
<version>1.4.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
</dependency>
</dependencies>
批量插入學生表stu資料
@Test
/**
* 創建stu表,增加一個info列簇,將students.txt的1000條資料全部插入
*/ public void PutStu() throws IOException {
TableName stu = TableName.valueOf("stu");
// 創建表
Admin admin = conn.getAdmin();
if (!admin.tableExists(stu)) {
admin.createTable(new HTableDescriptor(stu).addFamily(new HColumnDescriptor("info")));
}
Table stuTable = conn.getTable(stu);
ArrayList<Put> puts = new ArrayList<>();
// 讀取檔案
BufferedReader br = new BufferedReader(new FileReader("data/students.txt"));
int cnt = 0;
String line;
while ((line = br.readLine()) != null) {
String[] split = line.split(",");
String id = split[0];
String name = split[1];
String age = split[2];
String gender = split[3];
String clazz = split[4];
Put put = new Put(id.getBytes());
put.addColumn("info".getBytes(),"name".getBytes(),name.getBytes());
put.addColumn("info".getBytes(),"age".getBytes(),age.getBytes());
put.addColumn("info".getBytes(),"gender".getBytes(),gender.getBytes());
put.addColumn("info".getBytes(),"clazz".getBytes(),clazz.getBytes());
// 批量插入
puts.add(put);
cnt += 1;
if (cnt == 100) {
stuTable.put(puts);
puts.clear(); // 清空
cnt = 0;
}
// 逐條插入,效率低
// stuTable.put(put);
}
// 判斷Put的List是否為空
if (!puts.isEmpty()) {
stuTable.put(puts);
}
br.close();
}
代碼封裝
定義全域變數
// 定義全域變數
Connection conn;
Table stu;
定義全域方法 執行掃描操作
// 定義全域方法
// 執行掃描操作
public ResultScanner getScannerWithFilter(Filter filter) throws IOException {
Scan scan = new Scan();
scan.setFilter(filter);
return stu.getScanner(scan);
}
遍歷掃描的資料 (所有行)
// 遍歷掃描的資料(所有行)
public void printScanner(Filter filter) throws IOException {
for (Result rs : getScannerWithFilter(filter)) {
String rk = Bytes.toString(rs.getRow());
String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(rs.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
System.out.println(rk + "," + name + "," + age + "," + gender + "," + clazz);
}
}
使用CellUtil進行列印
// 使用CellUtil進行列印
public void printScannerWithCellUtil(Filter filter) throws IOException {
for (Result rs : getScannerWithFilter(filter)) {
for (Cell cell : rs.listCells()) {
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(rowkey + "," + value);
}
}
}
建立連接
@Before
// 建立連接
public void init() throws IOException {
// 創建組態檔
Configuration conf = HBaseConfiguration.create();
// 設定Zookeeper集群地址
conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");
conn = ConnectionFactory.createConnection(conf);
stu = conn.getTable(TableName.valueOf("stu"));
}
關閉連接
@After
// 關閉連接
public void close() throws IOException {
conn.close();
}
過濾器
過濾出Rowkey(id)中,包含8的學生資訊
@Test
// 過濾出Rowkey(id)中,包含8的學生資訊
public void RowFileterWithSubString() throws IOException {
SubstringComparator comparator = new SubstringComparator("8");
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, comparator);
printScanner(rowFilter);
}
運行結果:
過濾出stu表列簇名為info下的所有列的資料
@Test
// 過濾出stu表列簇名為info下的所有列的資料
public void FamilyFilterWithCom() throws IOException {
Scan scan = new Scan();
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator("info".getBytes()));
scan.setFilter(familyFilter);
Table test3 = conn.getTable(TableName.valueOf("stu"));
ResultScanner sc = test3.getScanner(scan);
for (Result rs : sc) {
for (Cell cell : rs.listCells()) {
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(rowkey + "," + value);
}
}
}
運行結果:
stu表中列名包含a的所有列的資料,使用正則運算式
@Test
// stu表中列名包含a的所有列的資料,使用正則運算式
public void QualifierFilterWithRegex() throws IOException {
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*a.*"));
printScannerWithCellUtil(qualifierFilter);
}
運行結果:
過濾出 資料中包含 文 的所有資料
@Test
// 過濾出 資料中包含 文 的所有資料
public void ValueFilterWithSubString() throws IOException {
ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("文"));
printScannerWithCellUtil(valueFilter);
}
運行結果:
過濾出 資料中包含 文 的所有資料
@Test
// 過濾出 資料中包含 文 的所有資料
public void ValueFilterWithSubString() throws IOException {
ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("文"));
printScannerWithCellUtil(valueFilter);
}
運行結果:
過濾出班級是 文科班 的學生的所有資訊
@Test
// 過濾出班級是 文科班 的學生的所有資訊
public void SingleColumnValueFilterWithBinaryPrefix() throws IOException {
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("文科".getBytes())
);
printScanner(singleColumnValueFilter);
}
運行結果:
過濾出班級是 文科班 的學生的所有資訊,最終結果沒有 clazz 列
@Test
// 過濾出班級是 文科班 的學生的所有資訊,最終結果沒有 clazz 列
public void SingleColumnValueExcludeFilterWithBinaryPrefix() throws IOException {
SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("文科".getBytes())
);
printScanner(singleColumnValueExcludeFilter);
}
運行結果:
過濾出年齡是 奇數 的學生的所有資訊
@Test
// 過濾出年齡是 奇數 的學生的所有資訊
public void SingleColumnValueFilterWithRegex() throws IOException {
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes()
, "age".getBytes()
, CompareFilter.CompareOp.EQUAL
, new RegexStringComparator("^[0-9]{0,1}[13579]$")
);
printScanner(singleColumnValueFilter);
}
運行結果:
查詢以150010008開頭的所有前綴的rowkey
@Test
// 查詢以150010008開頭的所有前綴的rowkey
public void PrefixFilter() throws IOException {
// 第一種方式
PrefixFilter prefixFilter = new PrefixFilter("150010008".getBytes());
printScanner(prefixFilter);
System.out.println("==================");
// 第二種方式
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator("150010008".getBytes()));
printScanner(rowFilter);
}
運行結果:
多過濾器綜合查詢
過濾出 理科班 中的 女生 年齡為奇數 的所有資訊
@Test
// 多過濾器綜合查詢
// 過濾出 理科班 中的 女生 年齡為奇數 的所有資訊
public void ComnineFilter() throws IOException {
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("理科".getBytes())
);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter("info".getBytes()
, "gender".getBytes()
, CompareFilter.CompareOp.EQUAL
, "女".getBytes()
);
SingleColumnValueFilter filter3 = new SingleColumnValueFilter("info".getBytes()
, "age".getBytes()
, CompareFilter.CompareOp.EQUAL
, new RegexStringComparator("^[0-9]{0,1}[13579]$")
);
/**
* MUST_PASS_ALL ===> and
* MUST_PASS_ONE ===> or
*/
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
filterList.addFilter(filter1);
filterList.addFilter(filter2);
filterList.addFilter(filter3);
printScanner(filterList);
}
運行結果:
完整代碼
package com.liangzai.hbase;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
public class Demo04Filter {
// 定義全域變數
Connection conn;
Table stu;
// 定義全域方法
// 執行掃描操作
public ResultScanner getScannerWithFilter(Filter filter) throws IOException {
Scan scan = new Scan();
scan.setFilter(filter);
return stu.getScanner(scan);
}
// 遍歷掃描的資料(所有行)
public void printScanner(Filter filter) throws IOException {
for (Result rs : getScannerWithFilter(filter)) {
String rk = Bytes.toString(rs.getRow());
String name = Bytes.toString(rs.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(rs.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(rs.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(rs.getValue("info".getBytes(), "clazz".getBytes()));
System.out.println(rk + "," + name + "," + age + "," + gender + "," + clazz);
}
}
// 使用CellUtil進行列印
public void printScannerWithCellUtil(Filter filter) throws IOException {
for (Result rs : getScannerWithFilter(filter)) {
for (Cell cell : rs.listCells()) {
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(rowkey + "," + value);
}
}
}
@Before
// 建立連接
public void init() throws IOException {
// 創建組態檔
Configuration conf = HBaseConfiguration.create();
// 設定Zookeeper集群地址
conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");
conn = ConnectionFactory.createConnection(conf);
stu = conn.getTable(TableName.valueOf("stu"));
}
@Test
// 過濾出Rowkey(id)中,包含8的學生資訊
public void RowFileterWithSubString() throws IOException {
SubstringComparator comparator = new SubstringComparator("8");
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, comparator);
printScanner(rowFilter);
}
@Test
// 過濾出stu表列簇名為info下的所有列的資料
public void FamilyFilterWithCom() throws IOException {
Scan scan = new Scan();
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL, new BinaryComparator("info".getBytes()));
scan.setFilter(familyFilter);
Table test3 = conn.getTable(TableName.valueOf("stu"));
ResultScanner sc = test3.getScanner(scan);
for (Result rs : sc) {
for (Cell cell : rs.listCells()) {
String rowkey = Bytes.toString(CellUtil.cloneRow(cell));
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.println(rowkey + "," + value);
}
}
}
@Test
// stu表中列名包含a的所有列的資料,使用正則運算式
public void QualifierFilterWithRegex() throws IOException {
QualifierFilter qualifierFilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL, new RegexStringComparator(".*a.*"));
printScannerWithCellUtil(qualifierFilter);
}
@Test
// 過濾出 資料中包含 文 的所有資料
public void ValueFilterWithSubString() throws IOException {
ValueFilter valueFilter = new ValueFilter(CompareFilter.CompareOp.EQUAL, new SubstringComparator("文"));
printScannerWithCellUtil(valueFilter);
}
@Test
// 過濾出班級是 文科班 的學生的所有資訊
public void SingleColumnValueFilterWithBinaryPrefix() throws IOException {
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("文科".getBytes())
);
printScanner(singleColumnValueFilter);
}
@Test
// 過濾出班級是 文科班 的學生的所有資訊,最終結果沒有 clazz 列
public void SingleColumnValueExcludeFilterWithBinaryPrefix() throws IOException {
SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("文科".getBytes())
);
printScanner(singleColumnValueExcludeFilter);
}
@Test
// 過濾出年齡是 奇數 的學生的所有資訊
public void SingleColumnValueFilterWithRegex() throws IOException {
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes()
, "age".getBytes()
, CompareFilter.CompareOp.EQUAL
, new RegexStringComparator("^[0-9]{0,1}[13579]$")
);
printScanner(singleColumnValueFilter);
}
@Test
// 查詢以150010008開頭的所有前綴的rowkey
public void PrefixFilter() throws IOException {
// 第一種方式
PrefixFilter prefixFilter = new PrefixFilter("150010008".getBytes());
printScanner(prefixFilter);
System.out.println("==================");
// 第二種方式
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, new BinaryPrefixComparator("150010008".getBytes()));
printScanner(rowFilter);
}
@Test
// 多過濾器綜合查詢
// 過濾出 理科班 中的 女生 年齡為奇數 的所有資訊
public void ComnineFilter() throws IOException {
SingleColumnValueFilter filter1 = new SingleColumnValueFilter("info".getBytes()
, "clazz".getBytes()
, CompareFilter.CompareOp.EQUAL
, new BinaryPrefixComparator("理科".getBytes())
);
SingleColumnValueFilter filter2 = new SingleColumnValueFilter("info".getBytes()
, "gender".getBytes()
, CompareFilter.CompareOp.EQUAL
, "女".getBytes()
);
SingleColumnValueFilter filter3 = new SingleColumnValueFilter("info".getBytes()
, "age".getBytes()
, CompareFilter.CompareOp.EQUAL
, new RegexStringComparator("^[0-9]{0,1}[13579]$")
);
/**
* MUST_PASS_ALL ===> and
* MUST_PASS_ONE ===> or
*/
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
filterList.addFilter(filter1);
filterList.addFilter(filter2);
filterList.addFilter(filter3);
printScanner(filterList);
}
@After
// 關閉連接
public void close() throws IOException {
conn.close();
}
}
到底啦!關注靚仔學習更多的大資料知識!😊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/437169.html
標籤:其他
上一篇:四種常用的微服務架構拆分方式
下一篇:Spark入門必知知識點
