IDEA代码操作Hbase(2)----程序案例
IDEA代码操作Hbase(2)----程序案例
电信数据
用户mdn 进入时间 离开时间 地区编号 经纬度
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503211049,20180503210349,8320113,118.908,32
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503200139,20180503194939,8320211,120.433,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503221114,20180503220114,8340122,117.403,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503174337,20180503174255,8310104,121.443,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111910,20180503111010,8320202,120.308,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503194724,20180503194124,8320506,120.683,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503090021,20180503085621,8340102,117.403,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111053,20180503105953,8320206,120.158,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503101914,20180503101514,8321112,119.288,32
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503215631,20180503215331,8340181,117.818,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503111508,20180503111108,8320204,120.293,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503095753,20180503094853,8320114,118.798,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503224430,20180503223930,8340104,117.203,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503203049,20180503201849,8320404,119.928,31
47BE1E866CFC071DB19D5E1C056BE28AE24C16E7,20180503110626,20180503110326,8320402,120.003,31
...
...51万行
一个用户会有很多记录
需求:提供用户的mdn,以进入时间为准,获取用户最新的三个位置(经纬度)
package com.shujia;
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 Demo03DianXin {
Connection conn;
TableName dianXin;
@Before
public void init() throws IOException {
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "master:2181,node1:2181,node2:2181");
conn = ConnectionFactory.createConnection(conf);
dianXin = TableName.valueOf("dianXin");
}
@Test
// 建表
public void createTable() throws IOException {
//操作表结构,需要调取getAdmin()方法
Admin admin = conn.getAdmin();
//判断表是否存在
if (!admin.tableExists(dianXin)) {
admin.createTable(new HTableDescriptor(dianXin)//创建表,指定表名为dianxin
.addFamily(new HColumnDescriptor("cf1")//添加一个列簇,列簇名为 cf1
.setMaxVersions(5)));//设置版本为5个
} else {
System.out.println("表已经存在!");
}
}
@Test
//加载数据,将数据写入HBase
public void putALL() throws IOException {
//操作数据,需要调取getTable()方法
Table dx_tb = conn.getTable(dianXin);
//new一个ArrayList作为批量插入使用
ArrayList<Put> puts = new ArrayList<>();
int cnt = 0;
int batchSize = 1000;
BufferedReader br = new BufferedReader(new FileReader("data/DIANXIN.csv"));
//切分
String line;
while ((line = br.readLine()) != null) {
String[] split = line.split(",");
String mdn = split[0];
String start_time = split[1];//进入时间
String lg = split[4];//经度
String lat = split[5];//纬度
//加载数据到表
Put put = new Put(mdn.getBytes());//创建Put对象,指定rk=mdn
//插入数据需指定列簇名、列名,将进入时间、经纬度的数据插入进去(时间需要转化为时间戳)
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);
cnt += 1;//存放一条,cnt就会加1
if (cnt == batchSize) {//每1000条插入一次到表里
dx_tb.put(puts);//当cnt=batchSize=1000的时候,将集合里的数据加载到表里
puts.clear();//集合是数据加载一次后,然后清空
cnt = 0;//插入一次后,cnt置零
}
}
// 判断Put的List是否为空,不为空的话再插入一次
if (!puts.isEmpty()) {
dx_tb.put(puts);
}
br.close();
}
@Test
// 根据mdn获取用户最新的3个位置
public void getPositionByMdn() throws IOException {
//操作数据,需要调取getTable()方法
Table dx_tb = conn.getTable(dianXin);
//指定用户的mdn,用变量接收一下(用户的mdn就是表里的rk)
String mdn = "48049101CE9FC280703582E667DE3F3D947ABD37";
//new一个Get,用来获取表里的数据
Get get = new Get(mdn.getBytes());
get.setMaxVersions(3);//设置多版本为3,获得最新的3条数据
Result rs = dx_tb.get(get);//使用操作表的变量来获取数据
ArrayList<String> lgArr = new ArrayList<>();//new一个集合用来存经度
ArrayList<String> latArr = new ArrayList<>();//new一个集合用来存纬度
for (Cell cell : rs.listCells()) {
//使用CellUtil()来获取value,并转化为String类型
String value = Bytes.toString(CellUtil.cloneValue(cell));
if ("lg".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
lgArr.add(value); //如果value是经度的话,就添加到经度集合里
} else if ("lat".equals(Bytes.toString(CellUtil.cloneQualifier(cell)))) {
latArr.add(value);//如果value是经度的话,就添加到纬度集合里
}
}
//遍历经度和纬度集合
for (int i = 0; i < 3; i++) {
System.out.println(lgArr.get(i) + "," + latArr.get(i));
}
}
@After
public void close() throws IOException {
conn.close();
}
}
分类:
Hbase
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)