feat(database): 创建员工信息表并实现相关查询功能
- 创建员工信息表结构,包括 empnum、info、salary、performance 和 training列族 - 实现数据加载功能,从 emp.txt 文件中读取员工信息并插入表中- 添加员工信息查询功能,包括查询 ID 大于 7500 的员工、绩效大于4 且入职早于 2022 年的员工等 - 实现最近晋升员工和培训课程统计功能 - 添加 emp 表的字段名称说明文档
This commit is contained in:
parent
a053844b5c
commit
bd133feabe
14
emp.txt
Normal file
14
emp.txt
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
7369,SMITH,CLERK,7902,2021-12-17,800,0,20,160,4,2024-06-01,"Java基础,SQL优化"
|
||||||
|
7499,ALLEN,SALESMAN,7698,2021-02-20,1600,300,30,180,5,2024-09-15,"销售技巧,客户关系管理"
|
||||||
|
7521,WARD,SALESMAN,7698,2021-02-22,1250,500,30,170,3,2025-03-10,"谈判技巧,市场分析"
|
||||||
|
7566,JONES,MANAGER,7839,2021-04-02,2975,0,20,150,4,2024-07-01,"领导力培训,项目管理"
|
||||||
|
7654,MARTIN,SALESMAN,7698,2021-09-28,1250,1400,30,190,5,2024-10-01,"销售策略,数据分析"
|
||||||
|
7698,BLAKE,MANAGER,7839,2021-05-01,2850,0,30,140,4,2024-08-15,"团队建设,沟通技巧"
|
||||||
|
7782,CLARK,MANAGER,7839,2021-06-09,2450,0,10,130,5,2024-05-01,"人力资源管理,绩效考核"
|
||||||
|
7788,SCOTT,ANALYST,7566,2023-12-09,3000,0,20,165,4,2024-11-01,"数据分析,数据库优化"
|
||||||
|
7839,KING,PRESIDENT,null,2021-11-17,5000,0,10,120,5,2024-04-01,"战略规划,企业治理"
|
||||||
|
7844,TURNER,SALESMAN,7698,2021-09-08,1500,0,30,175,3,2024-02-15,"销售技巧,客户服务"
|
||||||
|
7876,ADAMS,CLERK,7788,2024-01-12,1100,0,20,155,4,2025-01-01,"办公软件,文档处理"
|
||||||
|
7900,JAMES,CLERK,7698,2021-12-03,950,0,30,145,3,2025-03-01,"客户服务,订单处理"
|
||||||
|
7902,FORD,ANALYST,7566,2021-12-03,3000,0,20,170,5,2024-06-01,"数据分析,报告撰写"
|
||||||
|
7934,MILLER,CLERK,7782,2023-01-23,1300,0,10,150,4,2024-07-01,"财务报表,预算管理"
|
2
emp表的字段名称.txt
Normal file
2
emp表的字段名称.txt
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
员工ID,姓名,职位,上司ID,入职时间,工资,奖金,部门ID,员工每月工作时长,绩效评分(1-5分),最近一次晋升日期,参加的培训课程列表
|
||||||
|
empno,ename,job,mgr,hiredate,sal,credit,deptno,work_hours,performance_rating,promotion_date,training_courses
|
141
src/main/EmpHBaseClient.java
Normal file
141
src/main/EmpHBaseClient.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
// 创建职工表结构
|
||||||
|
public void createEmpTable() throws IOException {
|
||||||
|
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||||
|
if (admin.tableExists("emp1520")) {
|
||||||
|
System.out.println("Table already exists");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf("emp1520"));
|
||||||
|
tableDesc.addFamily(new HColumnDescriptor("empnum")); // 存储员工ID
|
||||||
|
tableDesc.addFamily(new HColumnDescriptor("info")); // 存储基本信息
|
||||||
|
tableDesc.addFamily(new HColumnDescriptor("salary")); // 存储薪资
|
||||||
|
tableDesc.addFamily(new HColumnDescriptor("performance")); // 存储绩效信息
|
||||||
|
tableDesc.addFamily(new HColumnDescriptor("training")); // 存储培训课程
|
||||||
|
admin.createTable(tableDesc);
|
||||||
|
admin.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// 插入数据实现
|
||||||
|
public void loadData() throws IOException {
|
||||||
|
Table table = connection.getTable(TableName.valueOf("emp1520"));
|
||||||
|
try (BufferedReader br = new BufferedReader(new FileReader("emp.txt"))) {
|
||||||
|
String line;
|
||||||
|
while ((line = br.readLine()) != null) {
|
||||||
|
String[] fields = line.split(",");
|
||||||
|
String empno = fields[0];
|
||||||
|
String rowKey = generateRowKey(empno); // 生成MD5前缀+empno的RowKey
|
||||||
|
Put put = new Put(Bytes.toBytes(rowKey));
|
||||||
|
// empnum列族
|
||||||
|
put.addColumn(Bytes.toBytes("empnum"), Bytes.toBytes("empno"), Bytes.toBytes(empno));
|
||||||
|
// info列族
|
||||||
|
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("ename"), Bytes.toBytes(fields[1]));
|
||||||
|
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("job"), Bytes.toBytes(fields[2]));
|
||||||
|
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("mgr"), Bytes.toBytes(fields[3]));
|
||||||
|
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("hiredate"), Bytes.toBytes(fields[4]));
|
||||||
|
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("credit"), Bytes.toBytes(fields[5]));
|
||||||
|
// salary列族
|
||||||
|
put.addColumn(Bytes.toBytes("salary"), Bytes.toBytes("sal"), Bytes.toBytes(fields[6]));
|
||||||
|
// performance列族
|
||||||
|
put.addColumn(Bytes.toBytes("performance"), Bytes.toBytes("work_hours"), Bytes.toBytes(fields[7]));
|
||||||
|
put.addColumn(Bytes.toBytes("performance"), Bytes.toBytes("performance_rating"), Bytes.toBytes(fields[8]));
|
||||||
|
put.addColumn(Bytes.toBytes("performance"), Bytes.toBytes("promotion_date"), Bytes.toBytes(fields[9]));
|
||||||
|
// training列族
|
||||||
|
put.addColumn(Bytes.toBytes("training"), Bytes.toBytes("training_courses"), Bytes.toBytes(fields[10]));
|
||||||
|
table.put(put);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RowKey生成方法
|
||||||
|
private String generateRowKey(String empno) {
|
||||||
|
String prefix = empno.substring(0,3);
|
||||||
|
String md5 = md5Hash(prefix);
|
||||||
|
return md5.substring(0,4) + empno; // 前4位MD5+原empno
|
||||||
|
}
|
||||||
|
|
||||||
|
// MD5计算方法
|
||||||
|
private static String md5Hash(String input) {
|
||||||
|
try {
|
||||||
|
MessageDigest md = MessageDigest.getInstance("MD5");
|
||||||
|
byte[] messageDigest = md.digest(input.getBytes());
|
||||||
|
BigInteger number = new BigInteger(1, messageDigest);
|
||||||
|
return number.toString(16);
|
||||||
|
} catch (NoSuchAlgorithmException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 查询ID>7500的员工
|
||||||
|
public void queryEmpNoOver7500() throws IOException {
|
||||||
|
Scan scan = new Scan();
|
||||||
|
Filter filter = new SingleColumnValueFilter(
|
||||||
|
Bytes.toBytes("empnum"),
|
||||||
|
Bytes.toBytes("empno"),
|
||||||
|
CompareFilter.CompareOp.GREATER_OR_EQUAL,
|
||||||
|
new SubstringComparator("7500")
|
||||||
|
);
|
||||||
|
scan.setFilter(filter);
|
||||||
|
ResultScanner scanner = table.getScanner(scan);
|
||||||
|
for (Result result : scanner) {
|
||||||
|
// 输出结果处理
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 绩效>4且入职早于2022年
|
||||||
|
public void queryPerformanceAndHiredate() throws IOException {
|
||||||
|
FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);
|
||||||
|
list.addFilter(new SingleColumnValueFilter(
|
||||||
|
Bytes.toBytes("performance"),
|
||||||
|
Bytes.toBytes("performance_rating"),
|
||||||
|
CompareFilter.CompareOp.GREATER_OR_EQUAL,
|
||||||
|
new SubstringComparator("5")
|
||||||
|
));
|
||||||
|
list.addFilter(new SingleColumnValueFilter(
|
||||||
|
Bytes.toBytes("info"),
|
||||||
|
Bytes.toBytes("hiredate"),
|
||||||
|
CompareFilter.CompareOp.LESS,
|
||||||
|
new SubstringComparator("2022-01-01")
|
||||||
|
));
|
||||||
|
Scan scan = new Scan();
|
||||||
|
scan.setFilter(list);
|
||||||
|
ResultScanner scanner = table.getScanner(scan);
|
||||||
|
// 结果处理逻辑
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最近晋升员工查询
|
||||||
|
public void findLatestPromotion() throws IOException {
|
||||||
|
Scan scan = new Scan();
|
||||||
|
ResultScanner scanner = table.getScanner(scan);
|
||||||
|
List<PromotionRecord> records = new ArrayList<>();
|
||||||
|
for (Result result : scanner) {
|
||||||
|
String promotionDateStr = Bytes.toString(
|
||||||
|
result.getValue(Bytes.toBytes("performance"), Bytes.toBytes("promotion_date"))
|
||||||
|
);
|
||||||
|
if (promotionDateStr != null) {
|
||||||
|
records.add(new PromotionRecord(
|
||||||
|
Bytes.toString(result.getRow()),
|
||||||
|
LocalDate.parse(promotionDateStr)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
records.sort(Comparator.comparing(PromotionRecord::getDate).reversed());
|
||||||
|
// 输出最新记录
|
||||||
|
}
|
||||||
|
|
||||||
|
// 培训课程统计
|
||||||
|
public void countTrainingCourses() throws IOException {
|
||||||
|
Map<String, Integer> courseMap = new HashMap<>();
|
||||||
|
Scan scan = new Scan();
|
||||||
|
ResultScanner scanner = table.getScanner(scan);
|
||||||
|
for (Result result : scanner) {
|
||||||
|
String coursesStr = Bytes.toString(
|
||||||
|
result.getValue(Bytes.toBytes("training"), Bytes.toBytes("training_courses"))
|
||||||
|
);
|
||||||
|
if (coursesStr != null) {
|
||||||
|
for (String course : coursesStr.split(",")) {
|
||||||
|
courseMap.put(course, courseMap.getOrDefault(course, 0)+1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 输出统计结果
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user