業務場景為,統計隨訪表中最近一次訪問,且金額小于7 的總數。
隨訪表phs_visit主鍵為ID對應多條訪問記錄, 需要統計取ID的最大訪問時間visitDate, FBS小于7的資料, 統計ID的總數。
網上排序方法 sortByKey(), 不能實作對Value的排序。請大神看看有辦法解決么?
代碼如下:(怎么實作對visitTime 實作排序,取最大visitTime記錄?)
JavaSparkContext ctx = new JavaSparkContext(new SparkConf().setAppName("visitReport"));
//HBaseUtils.readFromHBase方法為封裝好的,從Hbase中讀取資料
JavaPairRDD<ImmutableBytesWritable, Result> visitHbaseRDD = HBaseUtils.readFromHBase(ctx, "phs_visit");
JavaPairRDD<String, Tuple2<String, Long>> visitRdd = visitHbaseRDD.mapToPair(tuple -> {
Result rs = tuple._2();
String id = ""; //編號
String FBS = ""; //金額
String visitDate = ""; //本次隨訪時間
if (rs != null && rs.getRow() != null) {
if (rs.getValue("CF".getBytes(), "ID".getBytes()) != null) {
id = Bytes.toString(rs.getValue("CF".getBytes(), "ID".getBytes())).trim();
}
if (rs.getValue("CF".getBytes(), "FBS".getBytes()) != null) {
FBS = Bytes.toString(rs.getValue("CF".getBytes(), "FBS".getBytes())).trim();
}
if (rs.getValue("CF".getBytes(), "VISITDATE".getBytes()) != null) {
visitDate = Bytes.toString(rs.getValue("CF".getBytes(), "VISITDATE".getBytes())).trim();
}
}
Long visitTime = 0L;
if(!StringUtils.isBlank(visitDate)) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
Date inputDate = dateFormat.parse(visitDate);
visitTime = inputDate.getTime();
}
return new Tuple2<>(id, new Tuple2<>(FBS, visitTime));
});
uj5u.com熱心網友回復:
Hbase表存盤多個version的資料:phs_visit主鍵為ID對應多條訪問記錄,但是獲取的時候 默認獲取的就是最新的一條,也就是同一個rowkey,你直接get拿到就是時間最大(最新)的那一條,然后使用過濾器,直接過濾列值FBS小于7即可。轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/39326.html
標籤:Spark
