Week09_day05(Java API操作Hbase)
生活随笔
收集整理的這篇文章主要介紹了
Week09_day05(Java API操作Hbase)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
package com.wyh.HbaseAPI; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
import org.apache.hadoop.hbase.HColumnDescriptor;
import org.apache.hadoop.hbase.HTableDescriptor;
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.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; public class Demo1Junit { //定義成員變量,保證每個test都可以訪問到
private Configuration conf;
private HConnection conn;
private HBaseAdmin hAdmin; /**
*
* 建立與Hbase的連接,設置成before,使下面的Test執行之前都先執行這個
*/
@Before
public void connect(){
try {
//獲取Configuration,讀取Hadoop的配置文件
conf = new Configuration(); //獲取zookeeper的配置
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
//獲取連接,可以通過這個連接獲取到表
conn = HConnectionManager.createConnection(conf); //獲取到HMaster,因為HMaster是對表進行DDL操作的
hAdmin = new HBaseAdmin(conf); System.out.println("建立連接成功。。。"+conn);
} catch (IOException e) {
e.printStackTrace();
}
} /**
*
* 在Hbase中創建表
*/
@Test
public void createTable(){
try {
//使用HTableDescriptor對象創建一個表對象
HTableDescriptor students = new HTableDescriptor("students"); //使用HColumnDescriptor對象創建一個列簇
HColumnDescriptor info = new HColumnDescriptor("info");
String name = Bytes.toString(students.getName()); //將列簇加入到表中
students.addFamily(info);
System.out.println(name+"表 創建成功。。"); //使用HMaster對象來創建該表
hAdmin.createTable(students);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 刪除Hbase中的表,在Hbase中并沒有真正將表進行刪除,內部是將其打上一個標記,上查詢不到,HMaster定時清理過期文件
*/
@Test
public void deleteTable(){
try {
//使用HMaster對象來讀表進行操作 //判斷是否有該表存在
if(hAdmin.tableExists("student")){ //在刪除表之前,必須將其表設置成不可用,否則報錯
hAdmin.disableTable("student"); //調用delete方法刪除表
hAdmin.deleteTable("student"); //友情提示
System.out.println(conn.getTable("student").getName()+"表 成功被刪除。。"); } } catch (IOException e) {
e.printStackTrace();
}
} /**
* 往創建的表中插入一條數據
*/
@Test
public void putData(){
try {
//獲取到表的實例
HTableInterface student = conn.getTable("student"); //創建Put實例,給一個行鍵
Put put = new Put("001".getBytes()); //將這個行鍵的值,添加列簇,列名,具體的值
put.add("info".getBytes(),"name".getBytes(),"zhangsan".getBytes()); //調用put方法添加一行數據
student.put(put); System.out.println(student.getName()+"表 成功插入數據。。"); } catch (IOException e) {
e.printStackTrace();
}
} /**
* get方法獲取到表的數據
*/
@Test
public void getData(){
try {
//獲取到表的實例
HTableInterface student = conn.getTable("student"); //獲取get實例 添加指定的rowkey
Get get = new Get("001".getBytes()); //獲取到行鍵信息
String rowkey = Bytes.toString(get.getRow()); //調用get方法,返回一個結果集
Result result = student.get(get);
//調用getValue()方法獲取到一個字節數組的一個結果集,再利用Bytes工具類的toString()方法去將其轉換成字符串
String s = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes())); //輸出
System.out.println(rowkey+"\t"+s);
System.out.println("查詢結束。。。"); } catch (IOException e) {
e.printStackTrace();
} } /**
* 一次性插入多條數據
*/
@Test
public void putAll(){
//創建一個ArrayList存Put
ArrayList<Put> puts = new ArrayList<Put>(); try {
//獲取表實例
HTableInterface students = conn.getTable("students"); //讀取數據
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\students.txt"));
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 put = new Put(id.getBytes()); //插入每一列
put.add("info".getBytes(),"name".getBytes(),name.getBytes());
put.add("info".getBytes(),"age".getBytes(),age.getBytes());
put.add("info".getBytes(),"gender".getBytes(),gender.getBytes());
put.add("info".getBytes(),"clazz".getBytes(),clazz.getBytes()); //將這個put對象加入到集合中去
puts.add(put);
} //使用put(List<Put> list)方法添加數據
students.put(puts); System.out.println("students.txt 數據插入完畢。。。");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 查詢結果,兩種方法進行查詢
*/
@Test
public void getdata(){
try {
//獲取到表的實例
HTableInterface students = conn.getTable("students"); //創建一個Get實例 穿一個行鍵
Get get = new Get("1500100014".getBytes());
String id = Bytes.toString(get.getRow()); //獲取結果集
Result result = students.get(get); /**
* 查詢方法一:已經知道列的數量和列名
*/
String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes())); System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+clazz); /**
* 查詢方法二:不知道列的數量和列名
* @deprecated as of 0.96, use {@link CellUtil#cloneValue(Cell)}
*/ List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String s = Bytes.toString(CellUtil.cloneValue(cell));
System.out.print(s);
System.out.print("\t");
} } catch (IOException e) {
e.printStackTrace();
}
} /**
* scan 查詢多條數據
*
*/
@Test
public void scanAll(){
try {
//獲取表的實例
HTableInterface students = conn.getTable("students"); //創建scan實例
Scan scan = new Scan(); //定義查詢的范圍 含頭不含尾
scan.setStartRow("1500100014".getBytes());
scan.setStopRow("1500100085".getBytes()); //將設置好的scan加入進去,返回一個結果的迭代器
ResultScanner scanner = students.getScanner(scan); //因為next()指向的是下一個索引,所以我們類似讀取數據的做法去遍歷取值
Result result;
while ((result=scanner.next())!=null){ //調用之前寫好的方法
print(result);
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
*
*
* scan掃描查詢有需求的數據,比較器和過濾器
*
* 通過運用4種比較器,過濾出姓于,年紀大于23歲,性別為女,且是理科的學生。
*
* 正則比較器 RegexStringComparator
* 包含比較器 SubstringComparator
* 二進制前綴比較器 BinaryPrefixComparator
* 二進制比較器 BinaryComparator
*
*/
@Test
public void FilterData(){
try {
//獲取表的實例
HTableInterface students = conn.getTable("students"); /**
* 第一個過濾器,過濾出班級是理科開頭的
*/
//創建比較器 正則比較器 RegexStringComparator
RegexStringComparator regexStringComparator = new RegexStringComparator("理科."); //創建過濾器 列過濾器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(),"clazz".getBytes(),
CompareFilter.CompareOp.EQUAL,regexStringComparator); /**
* 第二個過濾器,過濾出性別是女生的
*/
//創建比較器 包含比較器 SubStringComparator
SubstringComparator gender = new SubstringComparator("女"); //創建過濾器 列過濾器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "gender".getBytes(),
CompareFilter.CompareOp.EQUAL, gender); /**
* 第三個過濾器,過濾出年紀大于23歲的
*/
//創建比較器 二進制比較器 BinaryComparator
BinaryComparator binaryComparator = new BinaryComparator("23".getBytes()); //創建過濾器 列過濾器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "age".getBytes(),
CompareFilter.CompareOp.GREATER_OR_EQUAL, binaryComparator); /**
* 第四個過濾器,過濾出姓于的
*/
//創建比較器 二進制前綴比較器 BinaryPrefixComparator
BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("于".getBytes()); //創建過濾器 列過濾器 SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter3 = new SingleColumnValueFilter("info".getBytes(), "name".getBytes(),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator); //要想實現多個需求,就添加多個過濾條件
//創建一個過濾器列表,可以添加多個過濾器
FilterList filterList = new FilterList();
filterList.addFilter(singleColumnValueFilter);
filterList.addFilter(singleColumnValueFilter1);
filterList.addFilter(singleColumnValueFilter2);
filterList.addFilter(singleColumnValueFilter3); //創建scan實例
Scan scan = new Scan(); //將過濾器添加進去
scan.setFilter(filterList); //通過表的實例獲取結果迭代器
ResultScanner scanner = students.getScanner(scan); Result result = null;
while ((result = scanner.next())!=null){
print(result);
}
} catch (IOException e) {
e.printStackTrace();
} } /**
* 行鍵過濾器 RowFilter 使用 startRow/stopRow 方式比較好
*
*/
@Test
public void rowFilter(){
try {
//獲取表的實例
HTableInterface students = conn.getTable("students"); /**
* 使用行鍵比較器,過濾出學號是以15001001開頭的學生 過濾的對象是rowkey
*/
//創建filter實例
//創建比較器 使用二進制前綴比較器 BinaryPrefixComparator
BinaryPrefixComparator binaryPrefixComparator = new BinaryPrefixComparator("15001001".getBytes()); //創建過濾器 行鍵比較器 RowFilter()
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator); /**
* 使用二進制前綴比較器過濾出文科的
*/
//創建比較器 二進制前綴比較器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("文科".getBytes()); //創建過濾器
SingleColumnValueFilter singleColumnValueFilter = new SingleColumnValueFilter("info".getBytes(), "clazz".getBytes(),
CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //創建一個過濾器集合
FilterList filterList = new FilterList();
filterList.addFilter(rowFilter);
filterList.addFilter(singleColumnValueFilter); //創建scan實例
Scan scan = new Scan();
scan.setFilter(filterList); ResultScanner scanner = students.getScanner(scan);
Result result = null;
while ((result=scanner.next())!=null){
print(result);
} } catch (IOException e) {
e.printStackTrace();
} } /**
* 關閉連接
*/
@After
public void close(){
if(conn!=null){
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
} System.out.println("conn連接已經關閉。。");
} if(hAdmin!=null){
try {
hAdmin.close();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("hAdmin已經關閉。。"); }
} /**
* 編寫一個方法,實現調用實現顯示查詢結果
*/
public static void print(Result result){
String id = Bytes.toString(result.getRow());
String name = Bytes.toString(result.getValue("info".getBytes(), "name".getBytes()));
String age = Bytes.toString(result.getValue("info".getBytes(), "age".getBytes()));
String gender = Bytes.toString(result.getValue("info".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(result.getValue("info".getBytes(), "clazz".getBytes()));
System.out.println(id+"\t"+name+"\t"+age+"\t"+gender+"\t"+clazz);
} }
總結
以上是生活随笔為你收集整理的Week09_day05(Java API操作Hbase)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: flex布局之flex-shrink
- 下一篇: mysql物理备份工具Xtrabacku