因为数据清洗部分需要用到Mapreduce,所以先解决hbase的问题,可以用命令先在hbase存一下简单的数据进行查询,之后只要替换数据就可以实现了原本功能
在看该部分前,确保Hase API看了,懂了一点
题目
- 使用HBASE的API实现条件查询功能,具体内容如下:
(1)根据开始时间和结束时间搜索这段时间内的访问记录。输入信息为开始时间和结束时间,用‘|’字符隔开)
(2)根据用户ID搜索该用户的访问记录。输入信息为一个或多个用户ID,用‘|’字符隔开(并)
(3)根据关键字搜索含有该关键字的用户查询词记录。输入信息为一个或多个关键字,用‘|’字符隔开 (交)
(4)根据关键字(如baidu)等搜索相关网站的URL访问记录,输入信息为一个或多个关键字,用‘|’字符隔开(交)
(5)实现以上四个条件任意组合的联合搜索。四个条件之间用’+’字符隔开 (联合搜索要求所有条件同时满足)
分析
仔细分析一下这五个题目很像,就是用到了过滤器的知识,代码很类似。
CompareFilter.CompareOp.
LESS <
LESS_OR_EQUAL <=
EQUAL =
NOT_EQUAL <>
GREATER_OR_EQUAL >=
GREATER >
以(4)为例子
public static void selectURLs(String[] urls) throws IOException {
//过滤连 MUST_PASS_ALL(and) MUST_PASS_ONE(or)
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
//创建单列值过滤器
for(String url:urls){
SingleColumnValueFilter singleColumnValueFilter =
new SingleColumnValueFilter(Bytes.toBytes("hc"),Bytes.toBytes("URL"),
CompareFilter.CompareOp.EQUAL,new SubstringComparator(url));
//添加到过滤器
filterList.addFilter(singleColumnValueFilter);
}
Table table = HbaseUtils.getTable(Constants.TABLENAME);
HbaseUtils.showFilter(table,filterList);
HbaseUtils.close(table);
}
分析一下(5),比较坑的一点就是你可能会想到用split来切割
如果输入条件+1++
,最后得到的结果只有1,所以需要循坏字符串来切割
String[] parts={"","","",""};
int cnt = 0;
for(int i=0;i<line.length();i++){
if(line.charAt(i)!=‘+‘){
parts[cnt]+=line.charAt(i);
}else{
cnt++;
}
}