大数据之路Week10_day01 (练习:通过设计rowkey来实现查询需求)
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来实现查询需求)的更多相关文章
- 大数据性能调优之HBase的RowKey设计
1 概述 HBase是一个分布式的.面向列的数据库,它和一般关系型数据库的最大区别是:HBase很适合于存储非结构化的数据,还有就是它基于列的而不是基于行的模式. 既然HBase是采用KeyValue ...
- 基于Hadoop的大数据平台实施记——整体架构设计[转]
http://blog.csdn.net/jacktan/article/details/9200979 大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底 ...
- 基于Hadoop的大数据平台实施记——整体架构设计
大数据的热度在持续的升温,继云计算之后大数据成为又一大众所追捧的新星.我们暂不去讨论大数据到底是否适用于您的组织,至少在互联网上已经被吹嘘成无所不能的超级战舰.好像一夜之间我们就从互联网时代跳跃进了大 ...
- 胖子哥的大数据之路(11)-我看Intel&&Cloudera的合作
一.引言 5月8日,作为受邀嘉宾,参加了Intel与Cloudera在北京中国大饭店新闻发布会,两家公司宣布战略合作,该消息成为继Intel宣布放弃大数据平台之后的另外一个热点新闻.对于Intel的放 ...
- 胖子哥的大数据之路(9)-数据仓库金融行业数据逻辑模型FS-LDM
引言: 大数据不是海市蜃楼,万丈高楼平地起只是意淫,大数据发展还要从点滴做起,基于大数据构建国家级.行业级数据中心的项目会越来越多,大数据只是技术,而非解决方案,同样面临数据组织模式,数据逻辑模式的问 ...
- 胖子哥的大数据之路(7)- 传统企业切入核心or外围
一.引言 昨天和一个做互联网大数据(零售行业)的朋友交流,关于大数据传统企业实施的切入点产生了争执,主要围绕两个问题进行了深入的探讨: 问题1:对于一个传统企业而言什么是核心业务,什么是外围业务? 问 ...
- 胖子哥的大数据之路(6)- NoSQL生态圈全景介绍
引言: NoSQL高级培训课程的基础理论篇的部分课件,是从一本英文原著中做的摘选,中文部分参考自互联网.给大家分享. 正文: The NoSQL Ecosystem 目录 The NoSQL Eco ...
- 胖子哥的大数据之路(四)- VisualHBase功能需求框架
一.引言 大数据在结构化数据存储方面的应用需求越来越明确,但是大数据环境下辅助开发工具的不完善,给数据库管理人员和开发人员带来的不变难以言表,基于此创建了开源项目VisualHBase,同时创建了Vi ...
- 大数据:Hadoop(HDFS 的设计思路、设计目标、架构、副本机制、副本存放策略)
一.HDFS 的设计思路 1)思路 切分数据,并进行多副本存储: 2)如果文件只以多副本进行存储,而不进行切分,会有什么问题 缺点 不管文件多大,都存储在一个节点上,在进行数据处理的时候很难进行并行处 ...
- 大数据之路week07--day06 (Sqoop 将关系数据库(oracle、mysql、postgresql等)数据与hadoop数据进行转换的工具)
为了方便后面的学习,在学习Hive的过程中先学习一个工具,那就是Sqoop,你会往后机会发现sqoop是我们在学习大数据框架的最简单的框架了. Sqoop是一个用来将Hadoop和关系型数据库中的数据 ...
随机推荐
- 中电金信:产教联合共育人才 AFAC2024金融智能创新大赛启动
当前,人工智能技术正在蓬勃发展,引领着各行各业迈向智能化的新纪元,特别是在金融科技领域,伴随人工智能技术的不断迭代与突破,金融服务的边界也在不断拓展,传统的金融业态正经历着深刻的变革与重塑. 与此同时 ...
- Terraform Aliyun 创建ecs, kubernetes 实例
Terraform Aliyun 创建ecs, kubernetes 实例 terraform demo for aliyun 创建vpc, 网关, EIP, ecs, kubernetes, Ser ...
- 【C#】【平时练习】将左边列表框(List)的内容(月份)添加到右边列表框。最终右侧显示的内容(月份)要保持一定顺序
Aspx - 点击查看代码 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind=" ...
- Qt/C++开发经验小技巧286-290
国内站点:https://gitee.com/feiyangqingyun 国际站点:https://github.com/feiyangqingyun 很多时候项目越写越大,然后就可能遇到,明明之前 ...
- Qt编写安防视频监控系统58-子模块2窗口信息
一.前言 窗口信息一般用来打印输出文字信息,带时间,有些用户场景可能除了时间和内容以外,还需要其他的字段信息,可以自行在代码中增加字段即可,窗口信息一般以表格样式居多,上面是字段标题,下面是一行行的输 ...
- 大端地址 小端地址 网络字节序 intel主机字节序
小端字节序:低字节数据存放在内存低地址处,高字节数据存放在内存高地址处:大端字节序:高字节数据存放在内存低地址处,低字节数据存放在内存高地址处. 网络字节序: MSB 高字节前存法 Most Sign ...
- Android Studio中使用Java+OpenGL ES创建Android项目
首先是使用android studio生成空白的模板文件,包含一个MainActivity文件, 在onCreate方法中参照如下注释进行修改: package com.example.wang.an ...
- 闲话即时通讯:腾讯的成长史本质就是一部QQ成长史
1.前言 在猴年新春的时候,腾讯当时推出了新春广告片(点击观看视频),作为<弹指间 心无间>的延续.片中通过春节期间发送QQ红包让家人打车回家团聚,让我们感受到了"最温暖的红包, ...
- ImageSharp:高性能跨平台.NET开源图形库
在.Net中,System.Drawing有平台限制的问题,如果需要跨平台就需要使用第三方库. 今天推荐一个.NET开源图形库,不依赖任何库,支持跨平台的图形库. 01 项目简介 ImageSharp ...
- 使用Redis防止重复发送RabbitMQ消息
问题 今天遇到一个问题,发送MQ消息的时候需要保证不会重复发送,注意不是可靠到达(可靠到达可以通过消息确认机制和回调接口保证),这里保证的是不会生产多条一样的消息. 方法 综合讨论下来决定使用Redi ...