本帖最后由 pig2 于 2014-8-23 23:20 编辑
这里进行了一下修改:
首先你要明确 startkey与endkey的含义。
什么是start key
什么是end key
start key我这里的理解是必须包含下面三个元素,也就是说,无论是start key还是end key都必须是rowkey
假如我们换另外一种理解:
包括:
可能是这个范围是找不出来的。
如果说
个人认为这种可能性不大,但是没有验证
也就是说如果有范围的话,前缀需要是有序的,这样才能写出rowkey的范围
如果这个你认同的话,咱们继续。
那么既然是rowkey,前面有个散列字段,我们就不好确定end key都必须是rowkey,换句话说这个start key、end key是直接写不出来的。
这也就是我们所遇到的难题。
那么这个难题该如何解决?
首先我们根据下面帖子,
hbase RowFilter如何根据rowkey查询以及实例实现代码
能够达到抽出某个设备的信息,放到结果集中。这个是无容置疑的。
比如:我们就抽取设备00001的设备信息,这个通过SubstringComparator实现
如下:
- Filter filter3 = new RowFilter(CompareFilter.CompareOp.EQUAL,new SubstringComparator("设备号"));
复制代码
这个设备的信息出来了,剩下我们就要做什么那-------过滤时间段。
我们可以通过mapreduce分割数据,然后过滤出某个时间段的信息。最后输出结果。
其实这里面还有另外一个思路:
因为你的设备号还有时间肯定是属于某一个列吧,你直接使用hbase的多条件查询,结果直接就出来了。
例子如下:根据自己的情况修改。
- /**
- * 组合条件查询
- * @param tableName
- */
- public static void QueryByCondition3(String tableName) {
-
- try {
- HTablePool pool = new HTablePool(configuration, 1000);
- HTable table = (HTable) pool.getTable(tableName);
-
- List<Filter> filters = new ArrayList<Filter>();
-
- Filter filter1 = new SingleColumnValueFilter(Bytes
- .toBytes("column1"), null, CompareOp.EQUAL, Bytes
- .toBytes("aaa"));
- filters.add(filter1);
-
- Filter filter2 = new SingleColumnValueFilter(Bytes
- .toBytes("column2"), null, CompareOp.EQUAL, Bytes
- .toBytes("bbb"));
- filters.add(filter2);
-
- Filter filter3 = new SingleColumnValueFilter(Bytes
- .toBytes("column3"), null, CompareOp.EQUAL, Bytes
- .toBytes("ccc"));
- filters.add(filter3);
-
- FilterList filterList1 = new FilterList(filters);
-
- Scan scan = new Scan();
- scan.setFilter(filterList1);
- ResultScanner rs = table.getScanner(scan);
- for (Result r : rs) {
- System.out.println("获得到rowkey:" + new String(r.getRow()));
- for (KeyValue keyValue : r.raw()) {
- System.out.println("列:" + new String(keyValue.getFamily())
- + "====值:" + new String(keyValue.getValue()));
- }
- }
- rs.close();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- }
-
- }
复制代码
|