日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hbase 按时刻查询_Hbase查询工具类,根据时间查询数据

發布時間:2024/9/27 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hbase 按时刻查询_Hbase查询工具类,根据时间查询数据 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1,需求:已知空氣監測數據在hbase中存儲,要求按照時間,查詢citycode為110000(北京)一個月的數據,數據為每日的監測數據

ID ,CITYCODE,SO2 ,CO,NO2 ,O3, PM10,PM2_5,AQI,MEASURE, TIMEPOINT

13110000020141120,? 110000,31,3.939,141,8,368,301,351,6,2014-11-20

5110000020150108,?? 110000,53,3.305,101,12,176,143,190,4,2015-01-08

key值設計規則:

String yearMoth= "201411"; //年月

String time="20141120"; //年月日

String citycode="1100000"; //城市編碼

//hbase 為20個分區,數據進入hbase的分區規則如下

int region=Math.abs((yearMoth+citycode).hashCode())%20; //結果:8

//hbase的key值為

String key =region+citycode+time;

這樣設計key的好處是:同一個城市,每個月的數據的分區相同,即region相同,只需要設置startRowkey與endRowKey即可

例如 查詢北京 2014 年 11 月的數據

startRowkey:13110000020141100

endRowkey:??? 13110000020141200? 即可

但:如果查詢? 2014 年11 月20 號? --- 2015年01月08號的數據? 則需要把每個月的數據查詢出來,合并到一起

以下 為工具類的的方法:

創建 時間范圍的javaBean對象

public class TimeRange {

private String startPoint ;

private String endPoint ;

public String getStartPoint() {

return startPoint;

}

public void setStartPoint(String startPoint) {

this.startPoint = startPoint;

}

public String getEndPoint() {

return endPoint;

}

public void setEndPoint(String endPoint) {

this.endPoint = endPoint;

}

public String toString() {

return startPoint + " - " + endPoint ;

}

}

計算時間范圍的工具類:

startStr =20141120

endStr=20150108

得到的結果 List 為? 20141120-20141201

20141201-20150101

20150101-20150108

/**

* 計算查詢時間范圍

*/

public static List getCallLogRanges(String startStr , String endStr){

try{

SimpleDateFormat sdfYMD = new SimpleDateFormat("yyyyMMdd");

SimpleDateFormat sdfYM = new SimpleDateFormat("yyyyMM");

DecimalFormat df00 = new DecimalFormat("00");

//

List list = new ArrayList<>();

//字符串時間

String startPrefix = startStr.substring(0, 6);

String endPrefix = endStr.substring(0, 6);

int endDay = Integer.parseInt(endStr.substring(6, 8));

//結束點

String endPoint = endPrefix + df00.format(endDay + 1);

//日歷對象

Calendar c = Calendar.getInstance();

//同年月

if (startPrefix.equals(endPrefix)) {

TimeRange range = new TimeRange ();

range.setStartPoint(startStr); //設置起始點

range.setEndPoint(endPoint); //設置結束點

list.add(range);

} else {

//1.起始月

TimeRange range = new TimeRange ();

range.setStartPoint(startStr);

//設置日歷的時間對象

c.setTime(sdfYMD.parse(startStr));

c.add(Calendar.MONTH, 1);

range.setEndPoint(sdfYM.format(c.getTime()));

list.add(range);

//是否是最后一月

while (true) {

//到了結束月份

if (endStr.startsWith(sdfYM.format(c.getTime()))) {

range = new TimeRange ();

range.setStartPoint(sdfYM.format(c.getTime()));

range.setEndPoint(endPoint);

list.add(range);

break;

} else {

range = new TimeRange ();

//起始時間

range.setStartPoint(sdfYM.format(c.getTime()));

//增加月份

c.add(Calendar.MONTH, 1);

range.setEndPoint(sdfYM.format(c.getTime()));

list.add(range);

}

}

}

return list ;

}

catch(Exception e){

e.printStackTrace();

}

return null ;

}

Hbase 查詢的時 遍歷List

public List getLogByContion(String citycode, List ranges) {

Configuration conf = HBaseConfiguration.create();

Connection conn = ConnectionFactory.createConnection(conf);

TableName tableName = TableName.valueOf("hbase:airDay");

table=conn.getTable(tableName);

List list = new ArrayList<>();

try {

for (TimeRange range: ranges) {

Scan scan = new Scan();

//設置掃描起始行 結束行

scan.setStartRow(Bytes.toBytes(HbaseUtils.getStartRowkey(citycode,range.getStartPoint())));

scan.setStopRow(Bytes.toBytes(HbaseUtils.getStopRowkey(citycode,range.getStartPoint(),range.getEndPoint())));

ResultScanner rs = table.getScanner(scan);

Iterator it = rs.iterator();

byte[] f1 = Bytes.toBytes("f1");

byte[] caller = Bytes.toBytes("citycode");

byte[] callee = Bytes.toBytes("so2");

byte[] callTime = Bytes.toBytes("co");

byte[] callDuration = Bytes.toBytes("no2");

while (it.hasNext()) {

Result r = it.next();

Map map = new HashMap();

map.put("rowkey",Bytes.toString(r.getRow()));

map.put("caller",Bytes.toString(r.getValue(f1,citycode)));

map.put("callee",Bytes.toString(r.getValue(f1,so2)));

map.put("callTime",Bytes.toString(r.getValue(f1,co)));

map.put("callDuration",Bytes.toString(r.getValue(f1,no2)));

list.add(map);

}

}

}catch (Exception e){

}

return list;

}

public static String getStartRowkey(String citycode, String time) {

int region=Math.abs((yearMoth+citycode).hashCode())%20;

return region+citycode+time;

}

public static String getStopRowkey(String citycode,String starttime, String endtime) {

int region=Math.abs((yearMoth+citycode).hashCode())%20;

return region+citycode+endtime;

}

總結

以上是生活随笔為你收集整理的hbase 按时刻查询_Hbase查询工具类,根据时间查询数据的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。