文章目录
I know, i know
地球另一端有你陪我
一、java api
package day50;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
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 Demo2API {
Connection conn;
Admin admin;
@Before
public void Conn() throws IOException {
Configuration conf = HBaseConfiguration.create();
// 配置ZK的地址,通过ZK可以找到HBase
conf.set("hbase.zookeeper.quorum"
,"master:2181,node1:2181,node2:2181");
// 创建连接
conn = ConnectionFactory.createConnection(conf);
// 关键
// 3、如果需要对表结构操作 则getAdmin 建表,删除表,修改列簇等等
// 对数据进行操作,则getTable 查表等等
admin = conn.getAdmin();
}
@Test
// 建表
public void createTable() throws IOException {
// 表格描述
HTableDescriptor htd
= new HTableDescriptor(TableName.valueOf("javatest2"));
// 列簇描述
HColumnDescriptor cf1 = new HColumnDescriptor("cf1");
// 先添加列簇再建表
htd.addFamily(cf1);
admin.createTable(htd);
}
@Test
//删除表
public void deleteTable() throws IOException {
TableName jt2 = TableName.valueOf("javatest2");
if(admin.tableExists(jt2)){
// 先disable,再关闭
admin.disableTable(jt2);
admin.deleteTable(jt2);
}
}
@Test
//修改表结构(列簇)
public void changeTable() throws IOException {
TableName jt2 = TableName.valueOf("javatest2");
// 获取表原有的结构
HTableDescriptor htdt = admin.getTableDescriptor(jt2);
// 在表原有的结构中 修改列簇的数组
HColumnDescriptor[] cfs = htdt.getColumnFamilies();
// 遍历表中原有的列簇
for (HColumnDescriptor cf : cfs) {
if("cf1".equals(cf.getNameAsString())){
cf.setMaxVersions(10000);
}
}
// 新增一个列簇
HColumnDescriptor cf2
= new HColumnDescriptor("cf2".getBytes());
htdt.addFamily(cf2);
// 记得应用修改
admin.modifyTable(jt2,htdt);
}
@Test
// 列出所有表 list
public void list() throws IOException {
TableName[] tableNames = admin.listTableNames();
for (TableName name : tableNames) {
System.out.println(name.getNameAsString());
}
}
@Test
// 插入数据 put
public void put() throws IOException {
// 拿到当前要插入的表
Table jt2 = conn.getTable(TableName.valueOf("javatest2"));
// 使用put需要一个put对象
// 相当于一条信息(一组cell)
Put put = new Put("001".getBytes());
// 装填cell
put.addColumn("cf1".getBytes()
,"name".getBytes() , "Jams".getBytes());
put.addColumn("cf1".getBytes()
,"age".getBytes() , "23".getBytes());
put.addColumn("cf1".getBytes()
,"id".getBytes() , "10001".getBytes());
// 发射
jt2.put(put);
}
@Test
// 获取数据 get
public void get() throws IOException {
// 拿到当前要查询的表
Table jt2 = conn.getTable(TableName.valueOf("javatest2"));
//选择查询的rowkey
Get get = new Get("001".getBytes());
// 获得查询结果
Result rs = jt2.get(get);
// 获取rk
byte[] rk = rs.getRow();
// 数组没有重写toString
System.out.println(rk);
// 特有的字节数组转字符串方法
System.out.println(Bytes.toString(rk));
// 获取cell
byte[] name = rs.getValue("cf1".getBytes(), "name".getBytes());
System.out.println(name);
System.out.println(Bytes.toString(name));
}
@Test
// put 读取写入一组数据
// 学生表信息
public void putAll() throws IOException {
Table stus = conn.getTable(TableName.valueOf("students"));
BufferedReader br = new BufferedReader(
new FileReader("data/students.txt"));
// 接收io读取对象
String line;
// 凑一波put一把丢
ArrayList<Put> puts = new ArrayList<Put>();
//设定一波的大小
int size = 50;
while ((line = br.readLine())!= null){
String[] splits = line.split(",");
String id = splits[0];
String name = splits[1];
String age = splits[2];
String gender = splits[3];
String clazz = splits[4];
Put put = new Put(id.getBytes());
byte[] cf1 = "cf1".getBytes();
put.addColumn(cf1,"name".getBytes() ,name.getBytes());
put.addColumn(cf1,"age".getBytes() ,age.getBytes());
put.addColumn(cf1,"gender".getBytes() ,gender.getBytes());
put.addColumn(cf1,"clazz".getBytes() ,clazz.getBytes());
// 每次put一个太费劲,塞到list里一把put
puts.add(put);
if(puts.size()== size){
stus.put(puts);
// 记得情况list
puts.clear();
}
}
// 循环外以防万一不被整除,还有残留,最后抖一下
if(!puts.isEmpty()){
stus.put(puts);
}
// 关闭流
br.close();
}
@Test
// 获取一组数据 scan
public void scan() throws IOException {
Table stus
= conn.getTable(TableName.valueOf("students"));
Scan scan = new Scan();
scan.withStartRow("1500100100".getBytes());
scan.withStopRow("1500100111".getBytes());
scan.setLimit(10);
for (Result rs : stus.getScanner(scan)) {
String id = Bytes.toString(rs.getRow());
String name = Bytes.toString(
rs.getValue("cf1".getBytes(), "name".getBytes()));
String age = Bytes.toString(
rs.getValue("cf1".getBytes(), "age".getBytes()));
String gender = Bytes.toString(
rs.getValue("cf1".getBytes(), "gender".getBytes()));
String clazz = Bytes.toString(
rs.getValue("cf1".getBytes(), "clazz".getBytes()));
System.out.println(id
+ "," + name + "," + age + "," + gender + "," + clazz);
stus.close();
}
}
@Test
// CellUtil
public void cellUtil() throws IOException {
Table stus = conn.getTable(TableName.valueOf("students"));
// scan可以指定rowkey的范围进行查询,或者是限制返回的条数
Scan scan = new Scan();
scan.withStartRow("1500100990".getBytes());
for (Result rs : stus.getScanner(scan)) {
String id = Bytes.toString(rs.getRow());
System.out.print(id + " ");
// 将一条数据的所有相关联的cell列举出来,可以跨列簇
// 使用CellUtil从每一个cell中取出数据
// 不需要考虑每条数据的结构
for (Cell cell : rs.listCells()) {
// cell工具类中的转换
//System.out.print(" ***" + cell + "*** ");
String value = Bytes.toString(CellUtil.cloneValue(cell));
System.out.print(value + " ");
}
System.out.println();
}
}
@After
public void close() throws IOException {
admin.close();
conn.close();
}
}
二、一个小小需求
package day50;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
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.FileReader;
import java.io.IOException;
import java.util.ArrayList;
public class Demo3DianXin {
/*
* 1、建表dianxin
* 2、将数据写入HBase
* 3、需求:根据用户mdn,查询用户最新的3个位置记录(经纬度)
*/
Connection conn;
Admin admin;
TableName dianxinTN;
@Before
public void before() throws IOException {
// 1、创建一个配置文件
Configuration conf = HBaseConfiguration.create();
// 配置ZK的地址,通过ZK可以找到HBase
conf.set("hbase.zookeeper.quorum"
, "master:2181,node1:2181,node2:2181");
// 2、创建连接
conn = ConnectionFactory.createConnection(conf);
// 3、创建Admin对象
admin = conn.getAdmin();
dianxinTN = TableName.valueOf("dianxin");
}
@Test
// 建表 dianxin cf1
public void createDianXinTable() throws IOException {
// 判断表存不存在,不存在则创建
if (!admin.tableExists(dianxinTN)) {
// 链式编程
admin.createTable(new HTableDescriptor(dianxinTN)
.addFamily(new HColumnDescriptor("cf1")
.setMaxVersions(5)));
} else {
System.out.println("表已经存在");
}
}
@Test
/**
* 插入数据
*/
public void putAll() throws IOException {
Table dianxin = conn.getTable(dianxinTN);
BufferedReader br
= new BufferedReader(
new FileReader("data/DIANXIN.csv"));
String line;
int batchSize = 1000;
ArrayList<Put> puts = new ArrayList<Put>();
while ((line = br.readLine()) != null) {
String[] splits = line.split(",");
String mdn = splits[0];
String start_time = splits[1];
String lg = splits[4];
String lat = splits[5];
Put put = new Put(mdn.getBytes());
// 向一个列簇中,传入两个子列
put.addColumn("cf1".getBytes()
, "lg".getBytes()
//时间戳
, Long.parseLong(start_time)
, lg.getBytes());
put.addColumn("cf1".getBytes()
, "lat".getBytes()
, Long.parseLong(start_time)
, lat.getBytes());
puts.add(put);
if (puts.size() == batchSize) {
dianxin.put(puts);
puts.clear();
}
}
if (!puts.isEmpty()) {
dianxin.put(puts);
}
}
@Test
// 根据mdn 获取该用户最新的3个位置记录
// 22D3303E585F7E63AAFFF77E61A7A36E74BCE031
public void getPosition() throws IOException {
Table dianxin = conn.getTable(dianxinTN);
String mdn = "22D3303E585F7E63AAFFF77E61A7A36E74BCE031";
Get get = new Get(mdn.getBytes());
// 控制显示出的版本号
get.setMaxVersions(3);
Result rs = dianxin.get(get);
// 通过getValue这种方式只能获取到最新的记录
// String lg = Bytes.toString(
// rs.getValue("cf1".getBytes(), "lg".getBytes()));
// 定义两个ArrayList分别接收经纬度
ArrayList<String> lgList = new ArrayList<>();
ArrayList<String> latList = new ArrayList<>();
for (Cell cell : rs.listCells()) {
// 获取当前数据的列名
String c = Bytes.toString(CellUtil.cloneQualifier(cell));
// 获取value值
String s = Bytes.toString(CellUtil.cloneValue(cell));
if("lg".equals(c)){
lgList.add(s);
}else if("lat".equals(c)){
latList.add(s);
}
}
// 由于时间戳自然降序的原因,数据以及有序
for (int i = 0; i < 3; i++) {
String lg = lgList.get(i);
String lat = latList.get(i);
System.out.println(lg + " " + lat);
}
}
@After
public void close() throws IOException {
admin.close();
conn.close();
}
}