news 2026/9/1 17:13:25

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
头歌实践教学平台:大数据存储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 = result[i];
int h = 0x0f & (x >>> 4);
int l = 0x0f & x;
sb.append(chars[h]).append(chars[l]);
}
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;
}
}

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/1 17:12:55

基于GeoToolKit实现连井剖面对比显示及交互

最近基于GeoToolkit实现单井或多井的柱状图的显示和交互&#xff0c;特别是多井的连通对比分析&#xff0c;很多功能GeoToolkit原来是没有的。因此需要拓展了GeoToolKit的许多功能。本文主要基于GeoToolKit/INT组件&#xff0c;针对多井的测井曲线、岩性剖面、含油气性和射孔井…

作者头像 李华
网站建设 2026/9/1 17:12:33

小米秋招测试开发笔试复盘:考点拆解与备考路线指南

2024年8月底&#xff0c;我坐在电脑前&#xff0c;点开小米集团秋招测试开发岗第一批笔试的链接。屏幕上的倒计时提示我&#xff1a;90分钟&#xff0c;2道编程题、1道测试设计题&#xff0c;外加10道计算机基础选择题。说实话&#xff0c;投简历之前我就对测试开发这个岗位做过…

作者头像 李华
网站建设 2026/9/1 17:08:43

计算机视觉第一原理:神经网络基础学习路线与PyTorch实战

这次我们来看一门课&#xff0c;而不是一个“一键部署的工具”。哥伦比亚大学的公开课“计算机视觉第一原理”&#xff08;First Principles of Computer Vision&#xff09;第十二讲&#xff0c;主题是神经网络。这一讲在整门课里的位置很关键&#xff1a;前几讲还在讲成像、特…

作者头像 李华