头歌实践教学平台:大数据存储2023(十四下答案)

十四、HBase 数据库设计之 RowKey

第2关:车联网 RowKey 设计

package step2;

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.Cell;

import org.apache.hadoop.hbase.CellUtil;

import org.apache.hadoop.hbase.HBaseConfiguration;

import org.apache.hadoop.hbase.TableName;

import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.util.Bytes;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.HashMap;

import java.util.Map;

public class Task {

static String\[\] chars = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

/**

* MD5 加密

* @param str 需要加密的文本

* @return 加密后的32位md5字符串

*/

public static String StringInMd5(String str) {

MessageDigest md5 = null;

try {

md5 = MessageDigest.getInstance("md5");

byte\[\] result = md5.digest(str.getBytes());

StringBuilder sb = new StringBuilder(32);

for (int i = 0; i < result.length; i++) {

byte x = resulti;

int h = 0x0f & (x >>> 4);

int l = 0x0f & x;

sb.append(charsh).append(charsl);

}

return sb.toString();

} catch (NoSuchAlgorithmException e) {

throw new RuntimeException(e);

}

}

/**

* 生成 row

*

* @param carId 汽车ID

* @param timestamp 时间戳

* @return rowkey 格式:5位md5前缀-carId-timestamp

*/

public String createRowKey(String carId, String timestamp) {

/********** begin **********/

// 1. MD5车辆ID,固定32位不会为空

String md5Full = StringInMd5(carId);

// 截取前5位哈希前缀

String prefix = md5Full.substring(0, 5);

// 严格拼接三段+分隔符,保证一定有值,杜绝空串

String rowKey = prefix + "-" + carId + "-" + timestamp;

return rowKey;

/********** end **********/

}

/**

* 查询某辆车在某个时间范围的交易记录

*

* @param carId 车辆ID

* @param startTimestamp 开始时间戳

* @param endTimestamp 截止时间戳

* @return map 存储 (rowkey,value)

*/

public Map<String, String> findLogByTimestampRange(String carId, String startTimestamp, String endTimestamp) throws Exception {

Map<String, String> map = new HashMap<>();

/********** begin **********/

Configuration conf = HBaseConfiguration.create();

conf.set("hbase.zookeeper.quorum", "localhost");

// 计算当前车辆固定哈希前缀

String fullMd5 = StringInMd5(carId);

String prefix = fullMd5.substring(0, 5);

String base = prefix + "-" + carId + "-";

// 构造Scan左右边界(左闭右开)

String startRow = base + startTimestamp;

long endTsNum = Long.parseLong(endTimestamp);

String stopRow = base + (endTsNum + 1);

Scan scan = new Scan(Bytes.toBytes(startRow), Bytes.toBytes(stopRow));

// 只读取需要的列,减少IO防超时

scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("val"));

try (Connection conn = ConnectionFactory.createConnection(conf);

Table table = conn.getTable(TableName.valueOf("car_data"));

ResultScanner scanner = table.getScanner(scan)) {

for (Result res : scanner) {

String rk = Bytes.toString(res.getRow());

Cell cell = res.getColumnLatestCell(Bytes.toBytes("info"), Bytes.toBytes("val"));

String val = Bytes.toString(CellUtil.cloneValue(cell));

map.put(rk, val);

}

}

/********** end **********/

return map;

}

}

有任何问题都可以随时关注私信!

相关推荐
IvorySQL3 小时前
PostgreSQL 日报|修复截断 zstd 备份检测(10 月 9 日)
数据库·postgresql
刘胡子大叔3 小时前
SQL 脚本的导入顺序
数据库·sql
代码什么用4 小时前
Spring对IoC的实现
数据库·spring
问商十三载4 小时前
AI引擎生成式优化实践:刑事辩护律师团队IP构建
大数据·人工智能
会议咨询5 小时前
2026年大数据、信息系统与智能通信国际会议(BDIIC 2026)
大数据·信息系统·智能通信
Raas1005 小时前
MAI Gateway(魔芋企业级AI网关)能力解析:AI网关能做故障转移吗?AI网关核心功能详解
大数据·人工智能·网关·ai·gateway·mai gateway
全栈练习生5 小时前
AI Agent 沙箱
python·ai
hz567896 小时前
涉密视频会议设备配置指南:终端、音视频采集与配套设施选型
服务器·网络·数据库·安全·实时音视频·信息与通信·智能硬件
广州浮点FLOATLIC6 小时前
许可证服务器迁移后软件打不开:研发 IT 怎样定位连接问题
linux·服务器·数据库
程序员Sunday6 小时前
MySQL 为什么使用 B+ 树索引?把范围查询、回表和覆盖索引连起来
数据库·mysql