大数据之路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和关系型数据库中的数据 ...
随机推荐
- 如何使用图片压缩降低COS流量成本?
导语 本文将介绍如何通过[图片压缩]能力,让您降本增效的使用 COS ,文章将写得浅显易懂,旨在快速带领用户了解图片压缩的用法及带来的收益. **** 图片压缩为什么会让您降本增效?******** ...
- redis中是没有Long类型的
redis中没有Long类型,存储进去后取出来会是Interger类型.需要自行转化,不可直接强转.否则将CCE. 本人在处理springboot的redisTemplate封装时发生了这个异常.解决 ...
- 【sprinb-boot】@ComponentScan 跳过扫描 excludeFilters
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = {Contr ...
- com.sun.xml.internal.messaging.saaj.util 不存在
maven 编译时报错:程序包com.sun.xml.internal.messaging.saaj.util不存在需要添加 <compilerArguments> <verbose ...
- Qt/C++音视频开发46-音视频同步保存到MP4
一.前言 用ffmpeg单独做视频保存不难,单独做音频保存也不难,难的是音视频同步保存到MP4中,重点是音视频要同步,其实这也不难,只要播放那边音视频同步后的数据,写入到文件即可.最难的是在播放过程中 ...
- Qt交叉编译整理的几点说明
关于交叉编译,对于初学者来说是个极难跨过去的砍(一旦跨过去了,以后遇到需要交叉编译的时候都是顺水推舟.信手拈来.),因为需要搭建交叉编译环境,好在现在厂家提供的板子基本上都是测试好的环境,尤其是提供的 ...
- Eclipse中如何快速查询一个类和方法在哪里被引用?
0.在Eclipse中使用全局搜索Ctrl+h的方法快速查询一个类在哪里被引用. 打开Eclipse,使用快捷键Ctrl+h,会弹出一个对话框,找到File Search页签,在Containing ...
- 基于NVIDIA NGC容器安装使用PaddlePaddle
基于NVIDIA NGC容器安装使用PaddlePaddle PaddlePaddle PaddlePaddle作为国内首个自主研发的深度学习平台,自2016年正式向专业社区开源,是一个技术先进.功能 ...
- 在Quartz .NET的工作类中使用依赖注入
Quartz .NET默认的Execute方法是不支持非空的构造函数的,所以.net core常用的构造函数依赖注入也搞不来,网上搜索一番搞定了这个问题. 解决方案简单来说就是自定义一个任务工厂,替换 ...
- Note -「q-analog」组合意义灭天地
(搁置, 填坑看心情.) \[\mathfrak{Defining~\LaTeX~macros\cdots} \newcommand{\qnum}[1]{\lbrack{#1}\rbrack_q} ...