大数据之路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和关系型数据库中的数据 ...
随机推荐
- liunx安装docker,portainer,mysql,rabbitMQ,nacos
由于公司框架迭代了,故此写个随笔,记录一下,方便日后回顾 1.准备 阿里云服务器(liunx CentOS 7.6) 2.前置工作 (1)查看系统版本 lsb_release -a (2)查看系统以及 ...
- 关于 Envoy on Windows
Window Image in hub.cocker.com envoy 的镜像位于 https://hub.docker.com/u/envoyproxy 之下,其中 Windows 包括如下 4 ...
- metasploit扫描mysql空密码
靶机IP 192.168.255.100 攻击机IP 192.168.255.200 流程开始 查找mysql登录模块 msf5 > search mysql_login 加载这个模块 msf5 ...
- 创建LVM报错:Can't initialize physical volume "/dev/sdb1" of volume group "myvg" without -ff
问题: 在使用fdisk /dev/sdb 删除原有LVM分区,在接着创建LVM新分区/dev/sdb1.完毕保存之后. 执行pvcreate /dev/sdb1出现报错 Can't initiali ...
- SpringBoot项目请求路径中有正反斜杠的处理办法
在Application中添加静态代码块: //默认情况下Tomcat等服务器是拒绝url中带%2F或者%5C的URL,因为它们经浏览器解析之后就变成了/和\, // 服务器默认是拒绝访问的,所以需要 ...
- Qt6中重大改变的QtMultimedia多媒体模块
一.前言 Qt 6.2 的第一个测试版刚刚发布,并在多个其他新附加组件中加入了全新的 Qt 多媒体模块.Qt Multimedia 是一个模块,它在 Qt 6 中发生了一些相当大的变化. 在很多方面, ...
- Typora设置自定义脚本上传图片
搭建图床服务 这里利用CloudFlare搭建免费的图床服务 cf-image-hosting 部署Pages $ git clone https://github.com/ifyour/cf-ima ...
- [转]CMake与Make最简单直接的区别
写程序大体步骤为: 1.用编辑器编写源代码,如.c文件. 2.用编译器编译代码生成目标文件,如.o. 3.用链接器连接目标代码生成可执行文件,如.exe. 但如果源文件太多,一个一个编译时就会特别麻烦 ...
- Ant和Ivy集成部署和使用
Apache Ivy是专门用来管理项目的jar包依赖的.我们知道Maven已经有很出色的这方面的功能,如果你已经在使用Maven,就没必要使用Ivy了.但是其实Maven除了这方面功能,还有很多强大的 ...
- 微信团队分享:微信后端海量数据查询从1000ms降到100ms的技术实践
本文由微信技术团队仇弈彬分享,原题"微信海量数据查询如何从1000ms降到100ms?",本文进行了内容修订和排版优化. 1.引言 微信的多维指标监控平台,具备自定义维度.指标的监 ...