美文网首页
尚硅谷大数据技术之电信客服

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

作者: 尚硅谷教育 | 来源:发表于2018-12-20 17:31 被阅读18次

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

    相关文章

      网友评论

          本文标题:尚硅谷大数据技术之电信客服

          本文链接:https://www.haomeiwen.com/subject/ohcukqtx.html