需求:
拿到的数据样式:(第一列为md5号码,第二列为进出时间,第四列和第五列为人所在的经纬度)
位置由经纬度确定,也就是说,拿到经纬度也就是拿到了一个人的位置
输入md5号码,根据进出时间来求出最新的三个经纬度
处理:
1、先对数据做一个处理,将所有的空格换成逗号方便后面处理
这里是将数据在shell里面做的转换
cat part-00000|tr “\t” “,” > part-00001
2、开始写代码
import com.jcraft.jsch.IO;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
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;
import java.util.List;
public class Demo03DianXin {
Connection conn;
Admin admin;//对表结构进行操作
TableName dianxinT = TableName.valueOf("dianxin");
Table dianxin;//对表中的数据进行操作
@Before
public void init() throws Exception{
HBaseConfiguration conf = new HBaseConfiguration();
conf.set("hbase.zookeeper.quorum","master,node1,node2");
conn = ConnectionFactory.createConnection(conf);
admin = conn.getAdmin();
dianxin = conn.getTable(dianxinT);
}
//创建表
@Test
public void createTable() throws Exception{
if (!admin.tableExists(dianxinT)){
HTableDescriptor dianxin = new HTableDescriptor(TableName.valueOf("dianxin"));
HColumnDescriptor cf = new HColumnDescriptor("cf");
cf.setMaxVersions(3);
cf.setTimeToLive(1000);
dianxin.addFamily(cf);
admin.createTable(dianxin);
}
}
//将数据写入hbase,以mdn作为rowkey,以起始时间作为写入hbase的时间戳
@Test
public void putAll() throws IOException{
BufferedReader br = new BufferedReader(new FileReader("D:\\BigDaTa\\JAVA项目\\ShuJia01\\data\\part-00001"));
String line = null;
int batchSize=1000;
ArrayList<Put> puts = new ArrayList<Put>();
while ((line=br.readLine())!=null){
String[] split = line.split(",");
byte[] mdn = split[0].getBytes();
Long start_time = Long.parseLong(split[1]);//以start_time作为每条数据的时间戳
byte[] lg = split[4].getBytes();//经度
byte[] lat = split[5].getBytes();//纬度
Put put = new Put(mdn);
put.addColumn("cf".getBytes(),"lg".getBytes(),start_time,lg);
put.addColumn("cf".getBytes(),"lat".getBytes(),start_time,lat);
puts.add(put);
if (puts.size()==batchSize){
dianxin.put(puts);
puts= new ArrayList<Put>();
}
}
if (puts.size()!=0){
dianxin.put(puts);
}
}
//根据用户的mdn获取用户最新的三个位置 使用get的方式获取
@Test
public void getPosition() throws Exception{
String mdn = "47BE1E866CFC071DB19D5E1C056BE28AE24C16E7";
Get get = new Get(mdn.getBytes());
get.setMaxVersions(3);
Result result = dianxin.get(get);
//这样只能获取最新的一条数据
// String lg = Bytes.toString(result.getValue("cf".getBytes(), "lg".getBytes()));
// String lat = Bytes.toString(result.getValue("cf".getBytes(), "lat".getBytes()));
// System.out.println(lg+","+lat);
ArrayList<String> lglist = new ArrayList<String>();
ArrayList<String> latlist = new ArrayList<String>();
List<Cell> cells = result.listCells();
for (Cell cell : cells) {
String column = Bytes.toString(CellUtil.cloneQualifier(cell));//列名
String value = Bytes.toString(CellUtil.cloneValue(cell));//列值
if ("lg".equals(column)){
lglist.add(value);
}else if ("lat".equals(column)){
latlist.add(value);
}
}
//输出
for (int i=0;i<3;i++){
System.out.println(lglist.get(i)+","+latlist.get(i));
}
}
@After
public void close() throws IOException {
conn.close();
}
}
在getPosition()中给出了一个md5号码,得到了最新的三个位置
感谢阅读,我是啊帅和和,一位大数据专业大四学生,祝你快乐。