3.2.4 数据查询方式二
思路:
a) 已知要查询的手机号码以及起始时间节点和结束时间节点,查询该节点范围内的该手机号码的通话记录。
b) 拼装startRowKey和stopRowKey,即扫描范围,要想拼接出扫描范围,首先需要了解rowkey组成结构,我们再来复习一下,举个大栗子:
|
rowkey:
分区号手机号码1通话建立时间手机号码2主(被)叫标记_通话持续时间
01_15837312345_20170527081033_1_0180
|
c) 比如按月查询通话记录,则startRowKey举例:
|
regionHash_158373123456_20170501000000
|
stopRowKey举例:
|
regionHash_158373123456_20170601000000
|
注意:startRowKey和stopRowKey设计时,后面的部分已经被去掉。
尖叫提示:rowKey的扫描范围为前闭后开。
尖叫提示:rowKey默认是有序的,排序规则为字符的按位比较
d) 如果查找所有的,需要多次scan表,每次scan设置为下一个时间窗口即可,该操作可放置于for循环中。
编码:
1) 新建工具类:ScanRowkeyUtil
该类主要用于根据传入指定的查询时间,生成若干组startRowKey和stopRowKey
|
package com.atguigu.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
- 该类主要用于根据用户传入的手机号以及开始和结束时间点,按月生成多组rowkey
*/
public class ScanRowkeyUtil {
private String telephone;
private String startDateString;
private String stopDateString;
List
int index = 0;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
private SimpleDateFormat sdf2 = new SimpleDateFormat("yyyyMMddHHmmss");
public ScanRowkeyUtil(String telephone, String startDateString, String stopDateString) {
this.telephone = telephone;
this.startDateString = startDateString;
this.stopDateString = stopDateString;
list = new ArrayList<>();
genRowKeys();
}
//01_15837312345_201711
//15837312345 2017-01-01 2017-05-01
public void genRowKeys(){
int regions = Integer.valueOf(PropertyUtil.getProperty("hbase.regions.count"));
try {
Date startDate = sdf.parse(startDateString);
Date stopDate = sdf.parse(stopDateString);
//当前开始时间
Calendar currentStartCalendar = Calendar.getInstance();
currentStartCalendar.setTimeInMillis(startDate.getTime());
//当前结束时间
Calendar currentStopCalendar = Calendar.getInstance();
currentStopCalendar.setTimeInMillis(startDate.getTime());
currentStopCalendar.add(Calendar.MONTH, 1);
while (currentStopCalendar.getTimeInMillis() <= stopDate.getTime()) {
String regionCode = HBaseUtil.genPartitionCode(telephone, sdf2.format(new Date(currentStartCalendar.getTimeInMillis())), regions);
// 01_15837312345_201711
String startRowKey = regionCode + "" + telephone + "" + sdf2.format(new Date(currentStartCalendar.getTimeInMillis()));
String stopRowKey = regionCode + "" + telephone + "" + sdf2.format(new Date(currentStopCalendar.getTimeInMillis()));
String[] rowkeys = {startRowKey, stopRowKey};
list.add(rowkeys);
currentStartCalendar.add(Calendar.MONTH, 1);
currentStopCalendar.add(Calendar.MONTH, 1);
}
} catch (ParseException e) {
e.printStackTrace();
}
}
/**
判断list集合中是否还有下一组rowkey
@return
*/
public boolean hasNext() {
if(index < list.size()){
return true;
}else{
return false;
}
}
/**
取出list集合中存放的下一组rowkey
@return
*/
public String[] next() {
String[] rowkeys = list.get(index);
index++;
return rowkeys;
}
}
|
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源,欢迎大家关注尚硅谷公众号(atguigu)了解更多。