一段非常长的数据,第一个是加密后的用户信息,后面依次是开始时间,结束时间,区县编码,经度,纬度....
现在我希望创建一张表,导入这些数据,查询一个用户最新的三次地点经纬度
我们就筛选一下数据,传入第一个,第二个,第四个,第五个就行
我将每个步骤分开了,下面的测试模块都是在第一个代码中的
一、创建连接
1、创建一个配置文件, 需要输入zookeeper节点信息,以及你的三台主机名称
2、创建连接
3、如果需要对表结构操作 则getAdmin;对数据进行操作,则getTable
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.Before;
import org.junit.Test;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class HbaseDianXin {
//设置全局变量方便下面的模块使用
Connection conn;
Admin admin;
//获取连接
@Before
public void conn() throws IOException {
//创建配置文件对象
Configuration conf = HBaseConfiguration.create();
//设置配置文件内容,zookeeper上的三个节点,通过zookeeper可以找到hbase
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
conn = ConnectionFactory.createConnection(conf);
admin = conn.getAdmin();
}
}
二、判断我们将要创建的表是否存在,存在就删除
应该注意的就是创建的是TableName对象,不是Table对象
@Test
//如果存在这个表就删除
public void delTable() throws IOException {
//tableExists()这个方法里面需要的参数是TableName类型的数据,
//conn.getTable(TableName.valueOf(""))这个方法获得的是Table类型的数据,不要混淆
TableName dianxin = TableName.valueOf("dianxin");
if(admin.tableExists(dianxin)){
//表如果存在,就先disable,再delete
admin.disableTable(dianxin);
admin.deleteTable(dianxin);
}else
System.out.println("表不存在");
}
三、创建表
1.创建一张表,并指定一个列簇
2.对列簇可以追加配置, 我这里设置了最大versions为5,也就是保存了最新的5次插入的数据
3.创建表
//根据数据创建表
@Test
public void createTable() throws IOException {
//首先我们获取这个表的结构
HTableDescriptor dianxin = new HTableDescriptor(TableName.valueOf("dianxin"));
//创建列簇
HColumnDescriptor info = new HColumnDescriptor("info");
//将列簇版本设置为5
info.setMaxVersions(5);
//向表中添加列簇
dianxin.addFamily(info);
admin.createTable(dianxin);
}
四、插入数据
1.通过IO流读取文本数据
2.创建一个表的对象
3. 采用批量插入的方式,,创建一个集合存储put对象,设置一个批大小batchSize,先将每次读取的数据存储到一个put对象,再将这个put对象传入到创建的集合中
4.如果集合的大小到达了批设置的大小,就将他put进表中,
5.最后一次插入的数据有可能达不到设置的批大小,我们直接将他put进table中
//插入数据
@Test
public void putAll() throws IOException {
BufferedReader br = new BufferedReader(new FileReader("data/DIANXIN.csv"));
Table dianxin = conn.getTable(TableName.valueOf("dianxin"));
int batchSize=1000;
String line=null;
//创建集合存储put对象
ArrayList puts = new ArrayList();
while((line=br.readLine())!=null){
String[] split = line.split(",");
String mdn = split[0];
String strat_time = split[1];
String lg = split[4];
String lat=split[5];
Put put = new Put(mdn.getBytes());
put.addColumn("info".getBytes(),"lg".getBytes(),Long.parseLong(strat_time),lg.getBytes());
put.addColumn("info".getBytes(),"lat".getBytes(),Long.parseLong(strat_time),lat.getBytes());
puts.add(put);
if(puts.size()==batchSize){
dianxin.put(puts);
puts.clear();
}
}
if(!puts.isEmpty()){
dianxin.put(puts);
}
}
插入完数据后可以检查一下有多少行数据
在默认情况下,count是按1000行汇报一次,每次只会数1条
我们可以 count '表名',{INTERVAL=>10000,CACHE=>1000}
10000条汇报一次,每次数1000条数据
五、根据行键,查询最新的3次用户位置信息
1.获取到这张表
2.通过行键,想要获取的数据版本,确定我们将获取的数据内容
3.get方法获取这条数据,这条数据,里面包含了多个cell
4.创建2个集合分别用来接受经度和纬度,这里是为了最终结果好看做的
不用集合,用Bytes.toString(CellUtil.cloneValue(cell))输出也是正确结果,就是结构有点问题不好看
@Test
/**
* 根据mdn,获取最新的3个记录
*/
public void getPositionByMDN() throws IOException {
Table dianxin = conn.getTable(TableName.valueOf("dianxin"));
String mdn = "3FFB277F72B22C5F2A87F5C5934384AEB3B62C7C";
//我们使用get方法,需要传入一个Get类型的对象
//创建对象时需要传入行键
Get get = new Get(mdn.getBytes());
//设置我们获取的是3个版本
get.setMaxVersions(3);
Result result = dianxin.get(get);
// 通过getValue这种方式只能获取到最新的记录
// String lg = Bytes.toString(rs.getValue("info".getBytes(), "lg".getBytes()));
// String lat = Bytes.toString(rs.getValue("info".getBytes(), "lat".getBytes()));
// System.out.println(lg + "," + lat);
List cells = result.listCells();
//创建集合分别用来接收经纬度
ArrayList lglist = new ArrayList();
ArrayList latlist = new ArrayList();
for (Cell cell : cells) {
String value = Bytes.toString(CellUtil.cloneValue(cell));
String qualifier = Bytes.toString(CellUtil.cloneQualifier(cell));
if("lg".equals(qualifier)){
lglist.add(value);
}else if(("lat").equals(qualifier)){
latlist.add(value);
}
}
for (int i = 0; i < 3; i++) {
System.out.println(lglist.get(i)+","+latlist.get(i));
}
}
|