文章目錄
- 前言:
- HBASE JAVA API
- 1、HBASE服務的連接
- 1.1 準備作業-下載maven并匯入maven依賴
- 1.2 準備作業-修改hosts檔案
- 1.3 HBase服務連接代碼
- 2 Namespace操作
- 2 Namespace操作
- 2.2 創建namespace
- 2.3 解決連接物件過時問題
- 2.4 提取工具類
- 2.5 使用工具類操作Namespace物件——列舉Namesapce
- 2.6 列舉Namespace對應的表名
- 2.7 列舉所有Namespace對應所有的表
- 2.8 列出指定Namespace指定的表描述器
- 2.9 洗掉Namespace
- 3 Table DDL
- 3.1 設計模板類
- 3.2 建表
- 3.3 修改表1:如果直接修改之前的保存資料沒有了,類似于sql的修改,應該先查后改
- 3.4 修改表2
- 3.5 洗掉列簇1
- 3.6 洗掉列簇2
- 3.7 例舉出某表的所有列簇
- 3.8 洗掉表
- 4 Table DML
- 4.1 獲取表物件
- 4.2 修改HBaseUtils
- 4.3 Put
- 4.4 批量插入資料
- 4.5 Get查詢 : 查詢單個列簇的所有列
- 4.6 Get查詢 : 獲取rowkey對應的所有的列簇
- 4.7 Get查詢 : 第三種列印列的方式
- 4.8 批量Get查詢
- 4.9 修改HBaseUtils
- 4.10 Scan查詢:掃描指定的表
- 4.11 洗掉資料
- HBASE 過濾器
- 1 SingleColumnValueFilter
- 2 RegexStringComparator
- 3 SubStringComparator
- 4 BinaryComparator
- 5 BinaryPrefixComparator
- 6 FamilyFilter
- 6.1 第一種方式
- 6.2 第二種方式
- 7 QualifierFilter
- 8 ColumnPrefixFilter
- 9 MultipleColumnPrefixFilter
- 10 ColumnRangeFilter
- 11 RowFilter
- 12 FirstKeyOnlyFilter
- 12.1 第一種
- 12.2 第二種
- 13 PageFilter
前言:
Hbase原理是面試的重點項([面試重點項]
今天,小姨子跟我攤牌:“姐夫,我喜歡你很久了,我知道你也喜歡我,你敢不敢跟我姐離婚,跟我浪跡天涯?”沒等她說完,我把她拉進臥室,指了指床頭上的婚紗照:“你看我跟你姐那么恩愛”,然后拉著她進書房,指了指墻上貼滿的“市散打冠軍”“市跆拳道冠軍”的獎狀:“你姐又那么優秀,我怎么舍得離開她,”
HBASE JAVA API
1、HBASE服務的連接
1.1 準備作業-下載maven并匯入maven依賴
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.2.1</version>
</dependency>
1.2 準備作業-修改hosts檔案
在window中hosts(要把所有的關于master的映射也配置上,否則無法連接)
192.168.49.150 hbase1
192.168.49.151 hbase2
192.168.49.152 hbase3
192.168.49.153 hbase4
1.3 HBase服務連接代碼
/**
* 連接到HBase的服務
*/
public class Demo1_Conn {
public static void main(String[] args) throws IOException {
//1. 獲取連接配置物件
Configuration configuration = new Configuration();
//2. 設定連接hbase的引數
configuration.set("hbase.zookeeper.quorum",
"centos2:2181,centos3:2181,centos4:2181");
//3. 獲取Admin物件
HBaseAdmin hBaseAdmin = new HBaseAdmin(configuration);
//4. 檢驗指定表是否存在,來判斷是否連接到hbase
boolean flag = hBaseAdmin.tableExists("ns1:user_info");
//5. 列印
System.out.println(flag);
}
}
2 Namespace操作
2 Namespace操作
/**
* 操作namespace
*/
public class Demo2_Namespace {
private HBaseAdmin hBaseAdmin;
@Before
public void before() throws IOException {
//1. 獲取連接配置物件
Configuration configuration = new Configuration();
//2. 設定連接hbase的引數
configuration.set("hbase.zookeeper.quorum",
"centos2:2181,centos3:2181,centos4:2181");
//3. 獲取Admin物件
hBaseAdmin = new HBaseAdmin(configuration);
}
@After
public void close() throws IOException {
hBaseAdmin.close();
}
}
2.2 創建namespace
/**
* 創建namespace
*/
@Test
public void createNamespace() throws IOException {
//1. 創建namespace物件
NamespaceDescriptor descriptor = NamespaceDescriptor.create("lixi").build();
//2. 提交hbase中創建物件
hBaseAdmin.createNamespace(descriptor);
}
2.3 解決連接物件過時問題
@Before
public void before2() throws IOException {
//1. 獲取連接配置物件
Configuration configuration = new Configuration();
//2. 設定連接hbase的引數
configuration.set("hbase.zookeeper.quorum",
"centos2:2181,centos3:2181,centos4:2181");
//3. 獲取Admin物件
Connection connection = ConnectionFactory.createConnection(configuration);
hBaseAdmin = (HBaseAdmin) connection.getAdmin();
}
2.4 提取工具類
/**
* HBase Client工具類
*/
public class HBaseUtils {
private static final Logger logger = Logger.getLogger(HBaseUtils.class);
private final static String CONNECT_KEY = "hbase.zookeeper.quorum";
private final static String CONNECT_VALUE =
"centos2:2181,centos3:2181,centos4:2181";
/**
* 獲取Admin物件
*/
public static Admin getAdmin() {
//1. 獲取連接配置物件
Configuration configuration = new Configuration();
//2. 設定連接hbase的引數
configuration.set(CONNECT_KEY, CONNECT_VALUE);
//3. 獲取Admin物件
Connection connection = null;
Admin admin = null;
try {
connection = ConnectionFactory.createConnection(configuration);
admin = connection.getAdmin();
} catch (IOException e) {
logger.warn("連接HBase的時候例外!", e);
}
return admin;
}
public static void close(Admin admin) {
if(null != admin) {
try {
admin.close();
admin.getConnection().close();
} catch (IOException e) {
logger.warn("關閉admin的時候例外!", e);
}
}
}
}
2.5 使用工具類操作Namespace物件——列舉Namesapce
/**
* 列舉namespace
*/
@Test
public void listNamesapce() throws IOException {
//1. 獲取admin物件
Admin admin = HBaseUtils.getAdmin();
//2. 獲取namespace的所有描述器
NamespaceDescriptor[] namespaceDescriptors =
admin.listNamespaceDescriptors();
//3. 遍歷
for (NamespaceDescriptor descriptor : namespaceDescriptors) {
System.out.println(descriptor);
}
//4. 關閉
HBaseUtils.close(admin);
}
2.6 列舉Namespace對應的表名
@Test
public void listNamespaceTables() throws IOException {
//1. 獲取admin物件
Admin admin = HBaseUtils.getAdmin();
//2. 獲取name所有的表名
TableName[] tableNames = admin.listTableNamesByNamespace("ns1");
//3. 遍歷
for(TableName tableName : tableNames) {
System.out.println(tableName.getNameAsString());
}
//4. 關閉
HBaseUtils.close(admin);
}
2.7 列舉所有Namespace對應所有的表
/**
* 列舉所有namesacpe對應表名
*/
@Test
public void listAllNamespaceTables() throws IOException {
//1. 獲取admin物件
Admin admin = HBaseUtils.getAdmin();
//2. 獲取name所有的表名
TableName[] tableNames = admin.listTableNames();
//3. 遍歷
for(TableName tableName : tableNames) {
System.out.println(tableName.getNameAsString());
}
//4. 關閉
HBaseUtils.close(admin);
}
2.8 列出指定Namespace指定的表描述器
/**
* 列舉所有namesacpe對應表描述器
*/
@Test
public void listAllNamespaceTableDescriptor() throws IOException {
//1. 獲取admin物件
Admin admin = HBaseUtils.getAdmin();
//2. 獲取name所有的表名
HTableDescriptor[] tableDescriptors =
admin.listTableDescriptorsByNamespace("ns1");
//3. 遍歷
for(HTableDescriptor descriptor : tableDescriptors) {
System.out.println(descriptor.getTableName());
}
//4. 關閉
HBaseUtils.close(admin);
}
2.9 洗掉Namespace
/**
* 洗掉namespace
* 只能洗掉空的namespace
*/
@Test
public void dropNamespace() throws IOException {
//1. 獲取admin物件
Admin admin = HBaseUtils.getAdmin();
//2. 洗掉
admin.deleteNamespace("lee");
//3. 關閉
HBaseUtils.close(admin);
}
3 Table DDL
3.1 設計模板類
/**
* Table's CRUD DDL
*/
public class Demo4_Table {
Admin admin = HBaseUtils.getAdmin();
@After
public void after() {
HBaseUtils.close(admin);
}
}
3.2 建表
/**
* create 't2', {NAME => 'default', VERSIONS => 1}
*/
@Test
public void createTable() throws IOException {
//1. 創建表描述器
HTableDescriptor tableDescriptor = new
HTableDescriptor(TableName.valueOf("user_info"));
//2. 創建列簇表述qi
HColumnDescriptor columnDescriptor = new HColumnDescriptor("base_info");
//2.1 設定列簇版本從1到5
columnDescriptor.setVersions(1, 5);
columnDescriptor.setTimeToLive(24*60*60); // 秒為單位
// columnDescriptor.setMinVersions(1);
// columnDescriptor.setMaxVersions(5);
// columnDescriptor.setBloomFilterType(BloomType.ROW);
// columnDescriptor.setDFSReplication(3); // 設定HBase資料存放的副本數
HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("extra_info");
columnDescriptor2.setVersions(1, 5);
columnDescriptor2.setTimeToLive(24*60*60); // 秒為單位
//2.2 將列簇添加到表中
tableDescriptor.addFamily(columnDescriptor);
tableDescriptor.addFamily(columnDescriptor2);
//3. 提交
admin.createTable(tableDescriptor);
}
3.3 修改表1:如果直接修改之前的保存資料沒有了,類似于sql的修改,應該先查后改
/**
* 修改表1
*
*/
@Test
public void modifyTable() throws IOException {
//1. 創建表描述器
TableName tableName = TableName.valueOf("user_info");
HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
//2. 創建列簇表述qi
HColumnDescriptor columnDescriptor = new HColumnDescriptor("lixi_info");
//2.1 設定列簇版本從1到5
columnDescriptor.setVersions(1, 5);
columnDescriptor.setTimeToLive(24*60*60); // 秒為單位
//2.2 將列簇添加到表中
tableDescriptor.addFamily(columnDescriptor);
//3. 提交
admin.modifyTable(tableName, tableDescriptor);
}
3.4 修改表2
/**
* 修改表2 : 在原來的基礎之上進行修改
*
*/
@Test
public void modifyTable2() throws IOException {
//1. 創建表描述器
TableName tableName = TableName.valueOf("user_info");
HTableDescriptor tableDescriptor = admin.getTableDescriptor(tableName);
//2. 創建列簇表述qi
HColumnDescriptor columnDescriptor = new HColumnDescriptor("base_info");
//2.1 設定列簇版本從1到5
columnDescriptor.setVersions(1, 5);
columnDescriptor.setTimeToLive(24*60*60); // 秒為單位
//2.2 將列簇添加到表中
tableDescriptor.addFamily(columnDescriptor);
//3. 提交
admin.modifyTable(tableName, tableDescriptor);
}
3.5 洗掉列簇1
/**
* 修改表,洗掉列簇
*/
@Test
public void deleteColumnFamily() throws IOException {
//1. 創建表并洗掉列簇
TableName tableName = TableName.valueOf("user_info");
admin.deleteColumn(tableName, "lixi_info".getBytes());
}
3.6 洗掉列簇2
/**
* 洗掉列簇2
*/
@Test
public void deleteColumnFamily2() throws IOException {
//1. 創建表描述器
TableName tableName = TableName.valueOf("user_info");
HTableDescriptor tableDescriptor = admin.getTableDescriptor(tableName);
//2. 獲取要洗掉的列簇描述器
HColumnDescriptor columnDescriptor =
tableDescriptor.removeFamily("base_info".getBytes());
//3. 洗掉
admin.modifyTable(tableName, tableDescriptor);
}
3.7 例舉出某表的所有列簇
/**
* 例舉出某表的所有列簇
*/
@Test
public void listColumnFamily() throws IOException {
//1. 獲取表描述器
HTableDescriptor tableDescriptor =
admin.getTableDescriptor(TableName.valueOf("user_info"));
//2. 獲取所有的列簇
HColumnDescriptor[] columnFamilies = tableDescriptor.getColumnFamilies();
//3. 遍歷
for(HColumnDescriptor columnDescriptor : columnFamilies) {
System.out.println(columnDescriptor.getNameAsString());
System.out.println(columnDescriptor.getBlocksize());
System.out.println(columnDescriptor.getBloomFilterType());
}
}
3.8 洗掉表
/**
* 洗掉表
*/
@Test
public void dropTable() throws IOException {
TableName tableName = TableName.valueOf("t1");
if(admin.tableExists(tableName)) {
if (!admin.isTableDisabled(tableName)) {
admin.disableTable(tableName);
}
admin.deleteTable(TableName.valueOf("t1"));
}
}
4 Table DML
4.1 獲取表物件
public static Table getTable() {
return getTable("ns1:user_info");
}
public static Table getTable(String tablename) {
Table table = null;
if(StringUtils.isNotEmpty(tablename)) {
try {
table = connection.getTable(TableName.valueOf(tablename));
} catch (IOException e) {
logger.warn("獲取表產生例外!", e);
}
}
return table;
}
public static void close(Table table) {
if(table != null) {
try {
table.close();
} catch (IOException e) {
logger.warn("關閉table的時候產生例外!", e);
}
}
}
4.2 修改HBaseUtils
/**
* HBase Client工具類
*/
public class HBaseUtils {
private static final Logger logger = Logger.getLogger(HBaseUtils.class);
private final static String CONNECT_KEY = "hbase.zookeeper.quorum";
private final static String CONNECT_VALUE =
"centos2:2181,centos3:2181,centos4:2181";
private static Connection connection;
static {
//1. 獲取連接配置物件
Configuration configuration = HBaseConfiguration.create();
//2. 設定連接hbase的引數
configuration.set(CONNECT_KEY, CONNECT_VALUE);
//3. 獲取connection物件
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
logger.warn("連接HBase的時候例外!", e);
}
}
/**
* 獲取Admin物件
*/
public static Admin getAdmin() {
Admin admin = null;
try {
admin = connection.getAdmin();
} catch (IOException e) {
logger.warn("連接HBase的時候例外!", e);
}
return admin;
}
public static void close(Admin admin) {
if(null != admin) {
try {
admin.close();
} catch (IOException e) {
logger.warn("關閉admin的時候例外!", e);
}
}
}
public static Table getTable() {
return getTable("ns1:user_info");
}
public static Table getTable(String tablename) {
Table table = null;
if(StringUtils.isNotEmpty(tablename)) {
try {
table = connection.getTable(TableName.valueOf(tablename));
} catch (IOException e) {
logger.warn("獲取表產生例外!", e);
}
}
return table;
}
public static void close(Table table) {
if(table != null) {
try {
table.close();
} catch (IOException e) {
logger.warn("關閉table的時候產生例外!", e);
}
}
}
}
4.3 Put
/**
* DML
*/
public class Demo5_Table {
Table table = HBaseUtils.getTable();
@After
public void after() {
HBaseUtils.close(table);
}
/**
* 插入資料
*/
@Test
public void putData() throws IOException {
//1. 獲取Table物件
Table table = HBaseUtils.getTable();
//2. 獲取Put物件,通過rowkey指定
Put put = new Put(Bytes.toBytes("003"));
/*
* 3. 設定插入的資料
* 列簇、列名、value
*/
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
Bytes.toBytes("narudo"));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("age"),
Bytes.toBytes("15"));
put.addColumn(Bytes.toBytes("base_info"), Bytes.toBytes("sex"),
Bytes.toBytes("male"));
//4. 提交
table.put(put);
}
}
4.4 批量插入資料
/**
* 批量插入資料
*/
@Test
public void batchPutDatas() throws IOException {
//0. 創建集合
List<Put> list = new ArrayList<>();
//1. 創建put物件指定行鍵
Put rk004 = new Put(Bytes.toBytes("004"));
Put rk005 = new Put(Bytes.toBytes("005"));
Put rk006 = new Put(Bytes.toBytes("006"));
//2. 創建列簇
rk004.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("name"),Bytes.toBytes(
"gaoyuanyuan"));
rk005.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("age"),Bytes.toBytes("
18"));
rk005.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("sex"),Bytes.toBytes("
2"));
rk006.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("name"),Bytes.toBytes(
"fanbinbin"));
rk006.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("age"),Bytes.toBytes("
18"));
rk006.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("sex"),Bytes.toBytes("
2"));
//3. 添加資料
list.add(rk004);
list.add(rk005);
list.add(rk006);
table.put(list);
}
4.5 Get查詢 : 查詢單個列簇的所有列
/**
* get查詢資料
*/
@Test
public void getData() throws IOException {
//1. 獲Get物件
Get get = new Get(Bytes.toBytes("003"));
//2. 通過table獲取結果物件
Result result = table.get(get);
//3. 獲取指定列簇的map集合
NavigableMap<byte[], byte[]> base_info =
result.getFamilyMap(Bytes.toBytes("base_info"));
//4. 遍歷map
for(Map.Entry<byte[], byte[]> entry : base_info.entrySet()) {
String k = new String(entry.getKey());
String v = new String(entry.getValue());
System.out.println(k + "=" + v);
}
}
4.6 Get查詢 : 獲取rowkey對應的所有的列簇
/**
* get查詢資料
*/
@Test
public void getData2() throws IOException {
//1. 獲Get物件
Get get = new Get(Bytes.toBytes("003"));
//2. 通過table獲取結果物件
Result result = table.get(get);
//3. 獲取表格掃描器
CellScanner cellScanner = result.cellScanner();
System.out.println("rowkey : " + result.getRow());
//4. 遍歷
while (cellScanner.advance()) {
//5. 獲取當前表格
Cell cell = cellScanner.current();
//5.1 獲取所有的列簇
byte[] familyArray = cell.getFamilyArray();
System.out.println(new String(familyArray, cell.getFamilyOffset(),
cell.getFamilyLength()));
//5.2 獲取所有列
byte[] qualifierArray = cell.getQualifierArray();
System.out.println(new String(qualifierArray, cell.getQualifierOffset(),
cell.getQualifierLength()));
//5.3 獲取所有的值
byte[] valueArray = cell.getValueArray();
System.out.println(new String(valueArray, cell.getValueOffset(),
cell.getValueLength()));
}
}
4.7 Get查詢 : 第三種列印列的方式
/**
* get查詢資料
*/
@Test
public void getData2() throws IOException {
//1. 獲Get物件
Get get = new Get(Bytes.toBytes("003"));
//2. 通過table獲取結果物件
Result result = table.get(get);
//3. 獲取表格掃描器
CellScanner cellScanner = result.cellScanner();
System.out.println("rowkey : " + result.getRow());
//4. 遍歷
while (cellScanner.advance()) {
//5. 獲取當前表格
Cell cell = cellScanner.current();
//5.1 獲取所有的列簇
System.out.println(new String(CellUtil.cloneFamily(cell), "utf-8"));
System.out.println(new String(CellUtil.cloneQualifier(cell), "utf-8"));
System.out.println(new String(CellUtil.cloneValue(cell), "utf-8"));
}
}
4.8 批量Get查詢
**
* get查詢資料
*/
@Test
public void batchGetData() throws IOException {
//1. 創建集合存盤get物件
List<Get> gets = new ArrayList<>();
//2. 創建多個get物件
Get get = new Get(Bytes.toBytes("001"));
get.addColumn(Bytes.toBytes("extra_info"),Bytes.toBytes("height"));
get.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("sex"));
Get get1 = new Get(Bytes.toBytes("002"));
get1.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("name"));
get1.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("age"));
Get get2 = new Get(Bytes.toBytes("003"));
get2.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("sex"));
get2.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("age"));
Get get3 = new Get(Bytes.toBytes("004"));
//3. 添加get物件到集合中
gets.add(get);
gets.add(get1);
gets.add(get2);
gets.add(get3);
//4. 將集合物件添加到表中
Result[] results = table.get(gets);
//5. 遍歷
for(Result result : results) {
HBaseUtils.showResult(result);
}
}
4.9 修改HBaseUtils
public static void showResult(Result result){
CellScanner cellScanner = result.cellScanner();
System.out.print("rowKey: " + Bytes.toString(result.getRow()));
try {
while (cellScanner.advance()){
Cell current = cellScanner.current();
System.out.print("\t" + new
String(CellUtil.cloneFamily(current),"utf-8"));
System.out.print(" : " + new
String(CellUtil.cloneQualifier(current),"utf-8"));
System.out.print("\t" + new
String(CellUtil.cloneValue(current),"utf-8"));
}
} catch (UnsupportedEncodingException e) {
logger.error("判斷是否有下一個單元格失敗!",e);
} catch (IOException e) {
logger.error("克隆資料失敗!",e);
}
}
4.10 Scan查詢:掃描指定的表
/**
* 掃描表
*/
@Test
public void scanTable() throws IOException {
//1. 創建掃描器
Scan scan = new Scan();
//2. 添加掃描的行數包頭不包尾
scan.setStartRow(Bytes.toBytes("001"));
scan.setStopRow(Bytes.toBytes("006" + "\001")); //小技巧
//3. 添加掃描的列
scan.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("name"));
//4. 獲取掃描器
ResultScanner scanner = table.getScanner(scan);
Iterator<Result> it = scanner.iterator();
while (it.hasNext()){
Result result = it.next();
HBaseUtils.showResult(result);
}
}
4.11 洗掉資料
/**
* 洗掉資料
*/
@Test
public void deleteData() throws IOException {
//1. 創建集合用于批量洗掉
List<Delete> dels = new ArrayList<>();
//2. 創建洗掉資料物件
Delete del = new Delete(Bytes.toBytes("004"));
del.addColumn(Bytes.toBytes("base_info"),Bytes.toBytes("name"));
//3. 添加到集合
dels.add(del);
//4. 提交
table.delete(dels);
}
HBASE 過濾器
1 SingleColumnValueFilter
/**
* 高級查詢
* 過濾器鏈查詢
*/
public class Demo6_Filter {
/**
* 需求:
* select * from ns1_userinfo where age <= 18 and name = narudo
*/
@Test
public void listFilter() throws IOException {
/*
* 1. 創建過濾器鏈
* and條件使用MUST_PASS_ALL作為條件
* or條件使用MUST_PASS_ONE
*/
FilterList filterList = new
FilterList(FilterList.Operator.MUST_PASS_ALL);
/*
* 2. 構造查詢條件
* 對于單列值比較器使用SingleColumnValueFilter
* ColumnFamily, qualifier, 比較過濾器(大于、小于、等于、...), value
*/
SingleColumnValueFilter ageFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),
CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes("narudo"));
/*
* 3. 將條件加入到過濾器鏈中
*/
filterList.addFilter(ageFilter);
filterList.addFilter(nameFilter);
//4.創建掃描器進行掃描
Scan scan = new Scan();
//5. 將過濾條件關聯到掃描器
scan.setFilter(filterList);
//6. 獲取表物件
Table table = HBaseUtils.getTable();
//7. 掃描表
ResultScanner scanner = table.getScanner(scan);
//8. 列印資料
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
}
}
說明
- 這種查詢如果對應的行鍵,如果都包含了age和name列,就會對比值,如果都不滿足就將其過濾,如果 滿足就獲取,
- 如果包含其中也給值,name或者age,只要其中一個列滿足條件就會,就會獲取,
- 如果name和age都沒有,那么視為該行滿足條件
解決方案
在某個單值過濾器總添加
ageFilter.setFilterIfMissing(true);
nameFilter.setFilterIfMissing(true);
2 RegexStringComparator
/**
*
* 測驗正則比較器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void regexStringComparatorTest() throws IOException {
//1. 創建比較器,正則:以li開頭的
RegexStringComparator regexStringComparator = new
RegexStringComparator("[$a-z]i[$a-z]");
//2. 獲取單列值過濾器
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, regexStringComparator);
//3. 設定缺失
nameFilter.setFilterIfMissing(true);
//4.創建掃描器進行掃描
Scan scan = new Scan();
//5. 設定過濾器
scan.setFilter(nameFilter);
//6. 獲取表物件
Table table = HBaseUtils.getTable();
//7. 掃描表
ResultScanner scanner = table.getScanner(scan);
//8. 列印資料
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
}
封裝HBaseUtils
/**
* 顯示這個過濾器掃描的物件
*/
public static void showFilterResult(Filter filter) {
//4.創建掃描器進行掃描
Scan scan = new Scan();
//5. 設定過濾器
scan.setFilter(filter);
//6. 獲取表物件
Table table = HBaseUtils.getTable();
//7. 掃描表
ResultScanner scanner = null;
try {
scanner = table.getScanner(scan);
//8. 列印資料
Iterator<Result> iterator = scanner.iterator();
while (iterator.hasNext()) {
Result result = iterator.next();
HBaseUtils.showResult(result);
}
} catch (IOException e) {
logger.warn("獲取table的時候例外!", e);
} finally {
try {
table.close();
} catch (IOException e) {
logger.warn("關閉table的時候例外!", e);
}
}
}
修改之前方法
/**
*
* 測驗正則比較器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void regexStringComparatorTest() throws IOException {
//1. 創建比較器,正則:以li開頭的
RegexStringComparator regexStringComparator = new RegexStringComparator("
[$a-z]i[$a-z]");
//2. 獲取單列值過濾器
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, regexStringComparator);
//3. 設定缺失
nameFilter.setFilterIfMissing(true);
//4. 列印
HBaseUtils.showFilterResult(nameFilter);
}
3 SubStringComparator
/**
*
* 測驗subString比較器
* 需求:select * from ns1_userinfo where name like '%i%'
*/
@Test
public void subStringComparatorTest() throws IOException {
//1. 創建比較器,正則:以li開頭的
SubstringComparator substringComparator = new SubstringComparator("i");
//2. 獲取單列值過濾器
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, substringComparator);
//3. 設定缺失
nameFilter.setFilterIfMissing(true);
//4. 列印
HBaseUtils.showFilterResult(nameFilter);
}
4 BinaryComparator
/**
*
* 測驗二進制比較器
* 需求:select * from ns1_userinfo where name = 'lixi'
*/
@Test
public void binaryComparatorTest() throws IOException {
//1. 創建比較器,正則:以li開頭的
BinaryComparator binaryComparator = new
BinaryComparator(Bytes.toBytes("lixi"));
//2. 獲取單列值過濾器
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, binaryComparator);
//3. 設定缺失
nameFilter.setFilterIfMissing(true);
//4. 列印
HBaseUtils.showFilterResult(nameFilter);
}
5 BinaryPrefixComparator
/**
*
* 測驗二進制前綴比較器
* 需求:select * from ns1_userinfo where name like 'li%'
*/
@Test
public void binaryPrefixComparatorTest() throws IOException {
//1. 創建比較器,正則:以li開頭的
BinaryPrefixComparator binaryPrefixComparator = new
BinaryPrefixComparator(Bytes.toBytes("li"));
//2. 獲取單列值過濾器
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator);
//3. 設定缺失
nameFilter.setFilterIfMissing(true);
//4. 列印
HBaseUtils.showFilterResult(nameFilter);
}
6 FamilyFilter
6.1 第一種方式
/**
* 查詢以base開頭的列簇
*/
@Test
public void testColumnFamily1() {
//1. 創建正則比較器:以base開頭的字串
RegexStringComparator regexStringComparator = new
RegexStringComparator("^base");
//2. 創建FamilyFilter:結果中只包含滿足條件的列簇資訊
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,
regexStringComparator);
//3. 列印
HBaseUtils.showFilterResult(familyFilter);
}
6.2 第二種方式
/**
* 查詢包含xtr的列簇
*/
@Test
public void testColumnFamily2() {
//1. 創建正則比較器:以base開頭的字串
SubstringComparator substringComparator = new SubstringComparator("xtr");
//2. 創建FamilyFilter
FamilyFilter familyFilter = new FamilyFilter(CompareFilter.CompareOp.EQUAL,
substringComparator);
//3. 列印
HBaseUtils.showFilterResult(familyFilter);
}
7 QualifierFilter
/**
* 查詢包含xtr的列簇
*/
@Test
public void testQualifierFilter() {
//1. 創建正則比較器:以base開頭的字串
SubstringComparator substringComparator = new SubstringComparator("am");
//2. 創建FamilyFilter
QualifierFilter qualifierFilter = new
QualifierFilter(CompareFilter.CompareOp.EQUAL, substringComparator);
//3. 列印
HBaseUtils.showFilterResult(qualifierFilter);
}
8 ColumnPrefixFilter
/**
* 查詢包含xtr的列簇
*/
@Test
public void testColumnPrefixFilter() {
//1. 創建ColumnPrefixFilter
ColumnPrefixFilter columnPrefixFilter = new
ColumnPrefixFilter(Bytes.toBytes("a"));
//2. 列印
HBaseUtils.showFilterResult(columnPrefixFilter);
}
9 MultipleColumnPrefixFilter
/**
* 查找以“a”或“n”開頭的行和列族中的所有列
*/
@Test
public void testMultipleColumnPrefixFilter() {
//1. 創建ColumnPrefixFilter
byte[][] prefixes = new byte[][] {Bytes.toBytes("a"), Bytes.toBytes("n")};
MultipleColumnPrefixFilter multipleColumnPrefixFilter = new
MultipleColumnPrefixFilter(prefixes);
//2. 列印
HBaseUtils.showFilterResult(multipleColumnPrefixFilter);
}
10 ColumnRangeFilter
/**
* 查找以“age”到“name”的列的資訊
* minColumnInclusive:true為包含,false為不包含
*/
@Test
public void testColumnRangeFilter() {
//1. 創建ColumnPrefixFilter
ColumnRangeFilter columnRangeFilter = new
ColumnRangeFilter(Bytes.toBytes("age"), false,
Bytes.toBytes("name"), true);
//2. 列印
HBaseUtils.showFilterResult(columnRangeFilter);
}
11 RowFilter
/**
* 查找rowkey=002的資訊
*/
@Test
public void testRowFilter() {
//1. 創建RowFilter
BinaryComparator binaryComparator = new
BinaryComparator(Bytes.toBytes("002"));
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL,
binaryComparator);
//2. 列印
HBaseUtils.showFilterResult(rowFilter);
}
12 FirstKeyOnlyFilter
12.1 第一種
/**
* 查找指定表中的所有的行鍵的第一個列
*/
@Test
public void testFirstKeyOnlyFilter() {
//1. 創建RowFilter
FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();
//2. 列印
HBaseUtils.showFilterResult(firstKeyOnlyFilter);
}
12.2 第二種
/**
* 需求:select * from ns1_userinfo where age <= 18 or name = lixi
*/
@Test
public void listFilter2() {
//1.
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ONE);
SingleColumnValueFilter ageFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("age"),
CompareFilter.CompareOp.LESS_OR_EQUAL, Bytes.toBytes("18"));
SingleColumnValueFilter nameFilter = new
SingleColumnValueFilter(Bytes.toBytes("base_info"), Bytes.toBytes("name"),
CompareFilter.CompareOp.EQUAL, Bytes.toBytes("lixi"));
ageFilter.setFilterIfMissing(true);
nameFilter.setFilterIfMissing(true);
filterList.addFilter(ageFilter);
filterList.addFilter(nameFilter);
List<Filter> filters = filterList.getFilters();
for(Filter filter : filters) {
HBaseUtils.showFilterResult(filter);
}
}
13 PageFilter
/**
* 需求:每行顯示3條記錄
* 將全部的資料分頁顯示出來
*
* 思路:
* 1. 第一頁:
* select * from user_info where rowkey > \001 limit 3;
* 2. 其他頁
* select * from user_info where rowkey > 第一頁的maxrowkey limit 3;
* 3. 回圈什么時候結束?
* while(true) {
* select * from user_info where rowkey > 第一頁的maxrowkey limit 3;
* print 3行資料
* 結束條件:count<3
* }
*/
public class Demo7_PageFilter {
/**
* 測驗分頁顯示user_info表中的所有資料,分頁顯示為3行記錄
*/
@Test
public void testPageFilter() throws IOException {
//1. 創建分頁過濾器,并設定每頁顯示3條記錄
PageFilter pageFilter = new PageFilter(3);
//2. 構造掃描器
Scan scan = new Scan();
//3. 給掃描器設定過濾器
scan.setFilter(pageFilter);
//4. 獲取表的管理器
Table table = HBaseUtils.getTable();
//5. 遍歷顯示
String maxKey = ""; // 最大key值記錄器
while(true) {
int count = 0; // 計算器
//6. 獲取結構掃描器
ResultScanner scanner = table.getScanner(scan);
//7. 獲取迭代器迭代
Iterator<Result> iterator = scanner.iterator();
//8. 迭代
while (iterator.hasNext()) {
Result result = iterator.next();
System.out.println(new String(result.getRow()));
count++;
maxKey = Bytes.toString(result.getRow());
//9. 列印
HBaseUtils.showResult(result);
}
System.out.println("------------------------------------");
//10. 判斷是否可以結束
if (count < 3) break;
//11. 設定下一次開始查詢的行鍵號
scan.setStartRow(Bytes.toBytes(maxKey + "\001"));
}
}
}
有識訓?希望烙鐵們來個三連擊,讓更多的同學看到這篇文章
1、烙鐵們,關注我看完保證有所識訓,不信你打我,
2、點個贊唄,可以讓更多的人看到這篇文章,后續還會有很哇塞的產出,
本文章僅供學習及個人復習使用,如需轉載請標明轉載出處,如有錯漏歡迎指出
務必注明來源(注明: 來源:csdn , 作者:-馬什么梅-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294428.html
標籤:其他
上一篇:Hadoop大資料平臺

