hbase读取数据怎么快速转成json数组给前端

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "hadoop1,hadoop2,hadoop3");
HTable table = new HTable(conf, "DataCollection1");

System.out.println("scan1");
Scan scan1 = new Scan();

new PrefixFilter(Bytes.toBytes("row"));
Filter filter3= new PrefixFilter(Bytes.toBytes("2017-01-01"));
scan1.setFilter(filter3);

scan1.setMaxVersions();

            ResultScanner scanner1 = table.getScanner(scan1);  
            System.out.println("scan2");
            int count=0; 
            JSONArray array = new JSONArray();           
            for (Result r : scanner1) {
               System.out.println("sssss");
               JSONObject mapOfColValues = new JSONObject();// 创建json对象就是一个{name:wp}
                for (KeyValue kv : r.raw()) {
                    System.out.println(String.format("row:%s, family:%s, qualifier:%s, qualifiervalue:%s, timestamp:%s.", 
                            Bytes.toString(kv.getRow()), 
                             Bytes.toString(kv.getFamily()), 
                            Bytes.toString(kv.getQualifier()), 
                            Bytes.toString(kv.getValue()),
                            kv.getTimestamp()));

                    mapOfColValues.put(Bytes.toString(kv.getQualifier()),Bytes.toString(kv.getValue()));
                }
                array.add(mapOfColValues);
                count++;
                System.out.println(count);
            }            
            scanner1.close();  
            table.close();  
            //pool.close();
            System.out.println(count);
            System.out.println("-------------finished----------------");    

以上是我主要的代码, DataCollection1表的数据有7000万多条,我查询一天的数据(大概10万条左右), 到了循环scanner1的时候就卡住了,不知道为什么就是很慢。rowkey的设计是“时间|ID”,真的不知道该怎么弄,求教大神解答

1个回答

这个数据一般都是全部取出来后再映射的吧,还有你可以参考下spring jdbc的rommapper的映射

yuejiaying
yuejiaying 没学过redis,不知道怎么将hbase结合起来,有推荐的教材吗
接近 2 年之前 回复
yuejiaying
yuejiaying 回复airfling: 那么多数据全部放在redis里面不会有问题吗?
接近 2 年之前 回复
airfling
airfling 回复yuejiaying: 跑批任务可以第一次跑的时候是读取所有的数据,之后是跑增量数据,还有你还有可能有数据过期,那就再加个跑批是定时删除redis里面的过期数据,总体的思路就是这样
接近 2 年之前 回复
yuejiaying
yuejiaying 回复airfling: 厉害啊,谢谢啦,我先去试试看
接近 2 年之前 回复
airfling
airfling 回复yuejiaying: 就是分开两步走,有一个跑批任务定时几分钟或者半个小时跑一次把数据取出来放到redis里面,然后你的web应用从redis里面读取这部分的数据就会快很多
接近 2 年之前 回复
yuejiaying
yuejiaying 回复airfling: 怎么转成内存数据?
接近 2 年之前 回复
airfling
airfling 是我看错了,原来是hbase表,这个速度慢是无法避免的,只能去优化,例如先把hbase数据转成内存数据,然后从内存中读取数据转换
接近 2 年之前 回复
yuejiaying
yuejiaying 我上面那样写,循环取出来很慢,怎么全部取出来啊,可不可以不循环直接将ResultScanner转成json啊
接近 2 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!