尚硅谷大数据技术之电信客服

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 list = null;

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)了解更多。

你可能感兴趣的:(尚硅谷大数据技术之电信客服)