1、准备数据

链接:https://pan.baidu.com/s/1fRECXp0oWM1xgxc0uoniAA
提取码:4k43

2、需求如下

  (1)查询出10条某个人的最近出现的位置信息

  (2)查询出某个人在某一天在某个城市的所有位置信息

3、设计rowkey

  手机号_(某一个大值 - 进入位置的开始时间)

  因为Hbase的rowkey是以字典顺序来排序的,如果我们就直接将其存进去,是升序的,而要求是最新的位置信息,那么肯定是倒序的。

4、编写连接、创建表、插入数据、查询数据的代码

package com.wyh.parctise;

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 dianxin_Demo1 {
Configuration conf;
HConnection conn;
HBaseAdmin hBaseAdmin; @Before
public void Cline(){
try {
conf = new Configuration();
conf.set("hbase.zookeeper.quorum","master:2181,node1:2181,node2:2181");
conn = HConnectionManager.createConnection(conf);
hBaseAdmin = new HBaseAdmin(conf);
System.out.println("建立连接成功。。"+conn);
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 创建表
*/
@Test
public void createTable(){
try {
//创建表
HTableDescriptor dianxin_1 = new HTableDescriptor("dianxin_1");
//设置表的列簇
HColumnDescriptor info = new HColumnDescriptor("info"); //将列簇加入到
dianxin_1.addFamily(info);
//通过Hmaster的对象进行创建表
hBaseAdmin.createTable(dianxin_1); System.out.println(Bytes.toString(dianxin_1.getName())+"表 创建完毕。。");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 往表中批量的插入数据
*/
@Test
public void putAllData(){
//定义一个ArrayList集合存Put实例
ArrayList<Put> puts = new ArrayList<>();
try {
//获取到表的实例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//读取文件信息
BufferedReader br = new BufferedReader(new FileReader("D:\\shujia\\shujia006\\hadoop\\src\\data\\dianxin_data"));
String line;
while ((line=br.readLine())!=null){
//使用字符串的分割方法将其一行数据进行分割
String[] split = line.split(",");
if(!"\\N".equals(split[5])){
Long l = 20200000000000L-Long.parseLong(split[5]);
String startTime = String.valueOf(l); //将开始位置和手机号拼接作为rowkey
String rowkey = split[0]+"_"+startTime; String wg = split[1];
String cityID = split[2];
String qxID = split[3];
String stayTime = split[4];
String leaveTime = split[6];
String day = split[7]; //创建一个Put实例,将rowkey作为rowkey
Put put = new Put(rowkey.getBytes()); //将其他的字段作为列值加入
put.add("info".getBytes(),"wg".getBytes(),wg.getBytes());
put.add("info".getBytes(),"cityID".getBytes(),cityID.getBytes());
put.add("info".getBytes(),"qxID".getBytes(),qxID.getBytes());
put.add("info".getBytes(),"stayTime".getBytes(),stayTime.getBytes());
put.add("info".getBytes(),"leaveTime".getBytes(),leaveTime.getBytes());
put.add("info".getBytes(),"day".getBytes(),day.getBytes()); //将这个Put加入到puts集合中去
puts.add(put);
} } //将这个Put集合进行添加
dianxin_1.put(puts);
System.out.println(br.getClass().getName()+"文件数据加载完毕。。。"); //关闭输入流
br.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 读取一条数据
*/
@Test
public void getData(){
try {
//获取到表的实例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//创建get实例 提供一个行键
Long i = 20200000000000L - 20180503190539L;
String s1 = "D55433A437AEC8D8D3DB2BCA56E9E64392A9D93C_"+i;
Get get = new Get(s1.getBytes()); //通过调用get()方法来过去数据
Result result = dianxin_1.get(get); /**
* 第一种方式,已知列
*/
//调用getrow获取二进制数组结果,再用Bytes工具类的toString()方法转换为字符串
String id = Bytes.toString(result.getRow());
String[] split = id.split("_");
String pthone = split[0];
String startTime = split[1];
Long newstartTime = 20200000000000L-Long.parseLong(startTime); //调用返回结果的getValue()方法获取到每个字段值
String wg = Bytes.toString(result.getValue("info".getBytes(), "wg".getBytes()));
String cityID = Bytes.toString(result.getValue("info".getBytes(), "cityID".getBytes()));
String qxID = Bytes.toString(result.getValue("info".getBytes(), "qxID".getBytes()));
String stayTime = Bytes.toString(result.getValue("info".getBytes(), "stayTime".getBytes()));
String leaveTime = Bytes.toString(result.getValue("info".getBytes(), "leaveTime".getBytes()));
String day = Bytes.toString(result.getValue("info".getBytes(), "day".getBytes())); //输出到控制台
System.out.println(pthone+"\t"+wg+"\t"+cityID+"\t"+qxID+"\t"+stayTime+"\t"+newstartTime+"\t"+leaveTime+"\t"+day); /**
* 第二种方式,未知列
*
* @deprecated as of 0.96, use {@link CellUtil#cloneValue(Cell)}
*/
List<Cell> cells = result.listCells();
String id1 = Bytes.toString(result.getRow());
String[] split1 = id1.split("_");
String pthone1 = split1[0];
String startTime1 = split1[1]; System.out.print(pthone1+"\t"+startTime1+"\t");
for (Cell cell : cells) {
String s = Bytes.toString(CellUtil.cloneValue(cell));
System.out.print(s);
System.out.print("\t");
}
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 读取某个人的最新10条位置信息
*/
@Test
public void scanData(){
try {
//获取到表的实例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//创建scan实例
Scan scan = new Scan(); //创建比较器 二进制前缀比较器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("47BE1E866CFC071DB19D5E1C056BE28AE24C16E7".getBytes());
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //创建一个过滤器集合
FilterList filterList = new FilterList();
//将多个过滤器加进去
filterList.addFilter(rowFilter); //添加过滤器
scan.setFilter(filterList); //获取到scan结果集
ResultScanner scanner = dianxin_1.getScanner(scan); int count=0;
//遍历这个结果集
Result result;
while ((result=scanner.next())!=null){
print(result);
count = count+1;
if(count==10){
break;
}
}
} catch (IOException e) {
e.printStackTrace();
} } /**
* 读取某一天,某个人在某个城市的所有位置信息
*/
@Test
public void scanData1(){
try {
//获取到表的实例
HTableInterface dianxin_1 = conn.getTable("dianxin_1");
//创建scan实例
Scan scan = new Scan(); //创建比较器 二进制前缀比较器
BinaryPrefixComparator binaryPrefixComparator1 = new BinaryPrefixComparator("47BE1E866CFC071DB19D5E1C056BE28AE24C16E7".getBytes());
RowFilter rowFilter = new RowFilter(CompareFilter.CompareOp.EQUAL, binaryPrefixComparator1); //包含比较器
SubstringComparator substringComparator = new SubstringComparator("20180503"); //创建一个过滤器 列值过滤器
SingleColumnValueFilter singleColumnValueFilter1 = new SingleColumnValueFilter("info".getBytes(), "day".getBytes(),
CompareFilter.CompareOp.EQUAL, substringComparator); //包含比较器
SubstringComparator substringComparator1 = new SubstringComparator("83401"); //创建一个过滤器 列值过滤器
SingleColumnValueFilter singleColumnValueFilter2 = new SingleColumnValueFilter("info".getBytes(), "cityID".getBytes(),
CompareFilter.CompareOp.EQUAL, substringComparator1); //创建一个过滤器集合
FilterList filterList = new FilterList();
//将多个过滤器加进去
filterList.addFilter(rowFilter);
filterList.addFilter(singleColumnValueFilter2);
filterList.addFilter(singleColumnValueFilter1); //添加过滤器
scan.setFilter(filterList); //获取到scan结果集
ResultScanner scanner = dianxin_1.getScanner(scan); //遍历这个结果集
Result result;
while ((result=scanner.next())!=null){
print(result);
}
scanner.close();
} catch (IOException e) {
e.printStackTrace();
} } /**
* 关闭Hbase的连接
*/
@After
public void close(){
/**
* 关闭hBaseAdmin
*/
for (int i = 0;i<5;i++){
System.out.println();
} if(hBaseAdmin!=null){
try {
hBaseAdmin.close();
System.out.println("hBaseAdmin连接已经关闭。。");
} catch (IOException e) {
e.printStackTrace();
}
} /**
* 关闭connection
*/
if(conn!=null){
try {
conn.close();
System.out.println("connection连接已经关闭。。");
} catch (IOException e) {
e.printStackTrace();
}
}
} public static void print(Result result){
String id = Bytes.toString(result.getRow());
String[] split = id.split("_");
String pthone = split[0];
String startTime = split[1];
Long newstartTime = 20200000000000L-Long.parseLong(startTime); //调用返回结果的getValue()方法获取到每个字段值
String wg = Bytes.toString(result.getValue("info".getBytes(), "wg".getBytes()));
String cityID = Bytes.toString(result.getValue("info".getBytes(), "cityID".getBytes()));
String qxID = Bytes.toString(result.getValue("info".getBytes(), "qxID".getBytes()));
String stayTime = Bytes.toString(result.getValue("info".getBytes(), "stayTime".getBytes()));
String leaveTime = Bytes.toString(result.getValue("info".getBytes(), "leaveTime".getBytes()));
String day = Bytes.toString(result.getValue("info".getBytes(), "day".getBytes())); //输出到控制台
System.out.println(pthone+"\t"+wg+"\t"+cityID+"\t"+qxID+"\t"+stayTime+"\t"+newstartTime+"\t"+leaveTime+"\t"+day);
}
}

大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)的更多相关文章

  1. 大数据性能调优之HBase的RowKey设计

    1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...

  2. 基于Hadoop的大数据平台实施记——整体架构设计[转]

    http://blog.csdn.net/jacktan/article/details/9200979 大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底 ...

  3. 基于Hadoop的大数据平台实施记——整体架构设计

    大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底是否适用于您的组织,至少在互联网上已经被吹嘘成无所不能的超级战舰.好像一夜之间我们就从互联网时代跳跃进了大 ...

  4. 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作

    一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...

  5. 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM

    引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...

  6. 胖子哥的大数据之路(7)- 传统企业切入核心or外围

    一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...

  7. 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍

    引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文:  The NoSQL Ecosystem 目录 The NoSQL Eco ...

  8. 胖子哥的大数据之路(四)- VisualHBase功能需求框架

    一.引言 大数据在结构化数据存储方面的应用需求越来越明确,但是大数据环境下辅助开发工具的不完善,给数据库管理人员和开发人员带来的不变难以言表,基于此创建了开源项目VisualHBase,同时创建了Vi ...

  9. 大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)

    一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处 ...

  10. 大数据之路week07--day06 (Sqoop 将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具)

    为了方便后面的学习,在学习Hive的过程中先学习一个工具,那就是Sqoop,你会往后机会发现sqoop是我们在学习大数据框架的最简单的框架了. Sqoop是一个用来将Hadoop和关系型数据库中的数据 ...

随机推荐

  1. 【Amadeus原创】域用户完美执行应用程序

    企业环境中,为了安全起见一般都没有赋予域用户或者企业的PC客户端用户管理员权限. 但偶尔会有个别的程序一定需要管理员身份才能执行,如财务某些程序或专业的应用程序.那么如何不赋予用户管理员权限及密码但又 ...

  2. PDFSharp 常见问题

    PDFSharp 常见问题 PDFsharp: Frequently Asked Questions - PDFsharp and MigraDoc Wiki 1. PDFSharp 是什么? PDF ...

  3. zz Spring 是一种反模式

    Java 将会消亡 – Martin Vysny – 第一性原理思考 原文标题"Java 将会消亡", 我并不认可 Java 会消亡一说, 作者还处于 FP 亢奋期,而我已经从 F ...

  4. 【JavaWeb】【Cookie】通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆

    通过Cookie记录用户上次登陆时间并判断用户是否是首次登陆 Cookie类的构造方法 public Cookie(java.lang.String name,java.lang.String ) 1 ...

  5. 利用openssl生成SM2公私钥对

      openssl 1.1.1+ 版本增加了对SM2 的支持,所以我们就能直接使用这些版本的opsnssl 生成 SM2的公私钥对. 首先我们得在Linux 或者Windows服务器中安装对应版本的o ...

  6. maven常见命令之 -pl -am -amd

    昨天maven的deploy任务需要只选择单个模块并且把它依赖的模块一起打包,第一时间便想到了-pl参数,然后就开始处理,但是因为之前只看了一下命令的介绍,竟然花了近半小时才完全跑通,故记录此文. 假 ...

  7. Spring Security并结合JWT实现用户认证(Authentication) 和用户授权(Authorization)

    引言在Web应用开发中,安全一直是非常重要的一个方面.Spring Security基于Spring 框架,提供了一套Web应用安全性的完整解决方案. JwT (JSON Web Token) 是当前 ...

  8. APP网站小程序微信登录同步:需要微信公众号、小程序、开放平台打通用户体系(不同主体也行)

    要想APP网站小程序微信登录同步打通用户体系.我们需要将(不同主体也行)多个公众号和小程序都绑定到同一个微信开放平台上,获取到UnionID记录到数据库就可以了. 微信UnionID 机制说明 如果开 ...

  9. JS端实现图片、视频时直接下载而不是打开预览

    项目中的附件列表,通常情况都需要提供下载.删除的功能,功能本身没有什么要说的,都是基本功能,使用浏览器的的下载功能,也都是用window.open(url),或者window.location.hre ...

  10. Java AQS学习笔记

    1. AQS介绍 AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面. AQS是一个用来构建锁和同步器的框架,使 ...