0


词频的统计

任务8、词频统计
-参看本博《经典案例【词频统计】十一种实现方式》
-针对单词文本文件,统计每个单词出现的次数
hello hadoop hello spark
i love you hadoop and spark
i learn hadoop and scala

-思路:读取文件,通过拆分得到单词数组,定义一个哈希映射保存词频统计结果,遍历单词数组,如果第一次遇到某个单词,就在哈希映射里添加一个元素,单词为键,1为值;如果不是第一次遇到,那么在哈希映射里找到该键,将其值加1……

(一)编程实现
-在项目根目录里创建单词文本文件 - words.txt

在这里插入图片描述
-在net.guoxin.p03里创建t08子包,在子包里创建WordCount类

在这里插入图片描述
-读取文件所有行

在这里插入图片描述

-将文件行按空格拆分成单词数组

在这里插入图片描述

-针对每行单词数组进行词频统计

在这里插入图片描述
-按指定格式输出词频统计结果

在这里插入图片描述
-利用Python的绘图库来绘制词频统计的直方图

在这里插入图片描述
-查看完整代码

package net.guoxin.p03.t08;

import java.io.BufferedReader;
import java.io.FileReader;
import java.util.HashMap;
import java.util.Map;

/**

  • 功能:词频统计
  • 作者:郭鑫
  • 日期:2022年06月02日 */ public class WordCount { public static void main(String[] args) throws Exception { // 定义缓冲字符输入流 BufferedReader br = new BufferedReader(new FileReader(“words.txt”)); // 定义词频统计哈希映射 Map<String, Integer> wc = new HashMap<>(); // 定义行字符串变量 String nextLine = “”; // 读取文件,遍历所有行 while ((nextLine = br.readLine()) != null) { // 按空格拆分,得到单词数组 String[] words = nextLine.split(" “); // 遍历单词数组,进行单词计数 for (String word: words) { wc.put(word, wc.containsKey(word)? wc.get(word) + 1 : 1); } } // 按照指定格式输出词频统计结果 for (String key : wc.keySet()) { System.out.println(”(" + key + “,” + wc.get(key) + “)”); } } }

思考题:将词频统计结果按次数降序排列
(二)知识点讲解
1、哈希映射

-put(key, value) - 添加元素(键值对)
-get(key) - 按键取值
-containsKey(key) - 是否包含某个键
-keySet() - 键集合
-values() - 值集合

2、哈希集合
-add(e) - 添加元素
-remove(e) - 移除元素
-size() - 集合元素个数
-isEmpty() - 是否为空集

(三)拓展练习
任务1、网址去重

-去掉重复ip地址,生成distinct_ips.txt

在这里插入图片描述
任务2、统计不同网址访问次数

在这里插入图片描述
(一)编程实现
1、创建数据库和表
(1)创建学生数据库

-执行命令:CREATE DATABASE student CHARSET=‘utf8mb4’

在这里插入图片描述
(2)创建用户表
-执行命令:USE student,打开student数据库
-创建用户表 - t_user

CREATE TABLE

t_user

(

id

int(11) NOT NULL AUTO_INCREMENT COMMENT ‘用户ID’,

username

varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘用户名’,

password

varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘用户密码’,

telephone

varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘联系电话’,

register_time

timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT ‘注册时间’,
PRIMARY KEY (

id

) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4;

-执行语句,查看结果
在这里插入图片描述
在这里插入图片描述
-插入三条用户记录

INSERT INTO t_user (username, password, telephone, register_time) VALUES (‘admin’, ‘12345’, ‘13945456780’, ‘2022-01-01 09:10:34’);
INSERT INTO t_user (username, password, telephone, register_time) VALUES (‘brown’, ‘11111’, ‘13878789089’, ‘2022-03-12 19:05:44’);
INSERT INTO t_user (username, password, telephone, register_time) VALUES (‘alice’, ‘22222’, ‘15834345670’, ‘2022-04-04 15:16:24’);

-执行语句,查看结果

在这里插入图片描述
-查看用户表记录

在这里插入图片描述
-一条用户记录对应一个用户实体,这是一个映射

2、创建用户实体类
-在net.guoxin.p03.t09.bean包里创建User类

在这里插入图片描述
package net.guoxin.p03.t09.bean;

import java.util.Date;

/**

  • 功能:用户实体类
  • 作者:郭鑫
  • 日期:2022年06月02日 */ public class User { private int id; private String username; private String password; private String telephone; private Date registerTime;public int getId() { return id; }public void setId(int id) { this.id = id; }public String getUsername() { return username; }public void setUsername(String username) { this.username = username; }public String getPassword() { return password; }public void setPassword(String password) { this.password = password; }public String getTelephone() { return telephone; }public void setTelephone(String telephone) { this.telephone = telephone; }public Date getRegisterTime() { return registerTime; }public void setRegisterTime(Date registerTime) { this.registerTime = registerTime; }@Override public String toString() { return “User{” + “id=” + id + “, username='” + username + ‘’’ + “, password='” + password + ‘’’ + “, telephone='” + telephone + ‘’’ + “, registerTime=” + registerTime + ‘}’; } }

3、添加数据库驱动程序包
-在项目根目录创建libs目录,添加数据库驱动程序包
在这里插入图片描述
-此时,这个jar包还不能被项目使用,需要作为库添加到项目里

在这里插入图片描述

-单击【Add as Library…】菜单项

在这里插入图片描述
-此时,数据库驱动程序包就可以被项目使用了

在这里插入图片描述
-查看JDBC重要的接口和类

在这里插入图片描述

4、创建数据库连接管理类
-创建net.huawei.p03.t09.dbutils包,在包里创建ConnectionManager类
在这里插入图片描述
package net.guoxin.p03.t09.dbutils;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**

  • 功能:数据库连接管理类
  • 作者:郭鑫
  • 日期:2022年06月09日 */ public class ConnectionManager { // 数据库连接属性 private static final String DRIVER = “com.mysql.jdbc.Driver”; private static final String URL = “jdbc:mysql://localhost:3306/student?useSSL=false”; private static final String USER = “root”; private static final String PASSWORD = “903213”; // 改成自己数据库的密码/- 私有化构造方法,拒绝实例化 */ private ConnectionManager() { }/**- 获取数据库连接静态方法- @return 数据库连接 */ public static Connection getConnection() { // 定义数据库连接 Connection conn = null;try { // 安装数据库驱动 Class.forName(DRIVER); // 获取数据库连接 conn = DriverManager.getConnection(URL, USER, PASSWORD); // 提示用户数据库连接成功 System.out.println(“提示:数据库连接成功~”); } catch (ClassNotFoundException e) { System.err.println(“异常:数据库驱动程序未找到!”); } catch (SQLException e) { System.err.println(“异常:数据库连接失败!”); }// 返回数据库连接 return conn; }/- 关闭数据库连接静态方法- @param conn */ public static void closeConnection(Connection conn) { // 判断连接是否为空 if (conn != null) { try { // 判断连接是否关闭 if (!conn.isClosed()) { // 关闭数据库连接,释放资源 conn.close(); // 提示用户 System.out.println(“提示:数据库连接关闭~”); } } catch (SQLException e) { e.printStackTrace(); } } }/**- 主方法测试数据库连接- @param args */ public static void main(String[] args) { // 获取数据库连接 Connection conn = getConnection(); // 关闭数据库连接 closeConnection(conn); } }

-运行程序,查看结果

在这里插入图片描述
-故意把DRIVER改错,就会抛出异常被捕获

在这里插入图片描述

5、创建用户数据访问接口
在net.guoxin.p03.t09.dao包里创建UserDao接口(DAO: Data Access Object)

在这里插入图片描述
package net.guoxin.p03.t09.dao;

import net.guoxini.p03.t09.bean.User;

import java.util.List;

/**

  • 功能:用户数据访问接口
  • 作者:郭鑫
  • 日期:2022年06月09日 */ public interface UserDao { int insert(User user); int delete(int id); int update(User user); int findById(int id); List findAll(); User login(String username, String password); }

6、创建用户数据访问接口实现类
-在net.guoxin.p03.t09.dao.impl包里创建UserDaoImpl类

在这里插入图片描述

-实现UserDao接口,就要去实现接口里的抽象方法

-默认是全选

在这里插入图片描述

-单击【OK】按钮

package net.guoxin.p03.t09.dao.impl;

import net.guoxin.p03.t09.bean.User;
import net.guoxin.p03.t09.dao.UserDao;

import java.util.List;

/**

  • 功能:用户数据访问接口实现类
  • 作者:郭鑫
  • 日期:2022年06月09日 */ public class UserDaoImpl implements UserDao { @Override public int insert(User user) { return 0; }@Override public int delete(int id) { return 0; }@Override public int update(User user) { return 0; }@Override public int findById(int id) { return 0; }@Override public List findAll() { return null; }@Override public User login(String username, String password) { return null; } }

-下面,我们编写登录方法

**@Override
public User login(String username, String password) {
// 定义用户对象
User user = null;
// 获取数据库连接
Connection conn = ConnectionManager.getConnection();
// 创建SQL字符串
String strSQL = “select * from t_user where username = ? and password = ?”;
try {
// 创建预备语句对象(准备提供参数)
PreparedStatement pstmt = conn.prepareStatement(strSQL);
// 用参数值去设置占位符的值
pstmt.setString(1, username);
pstmt.setString(2, password);
// 执行SQL查询,返回结果集
ResultSet rs = pstmt.executeQuery();
// 遍历结果集,用记录值填充用户对象
while (rs.next()) {
// 创建用户对象
user = new User();
// 用当前记录字段值设置用户对象属性值
user.setId(rs.getInt(“id”));
user.setUsername(rs.getString(“username”));
user.setPassword(rs.getString(“password”));
user.setTelephone(rs.getString(“telephone”));
user.setRegisterTime(rs.getTimestamp(“register_time”));
}
} catch (SQLException e) {
System.err.println(e.getMessage());
}

// 返回用户对象                                                                           
return user;                                                                        

}

-在net.guoxin.p03.t09.test包里创建TestUserDaoImpl类
在这里插入图片描述
package net.guoxin.p03.t09.test;

import net.guoxin.p03.t09.bean.User;
import net.guoxin.p03.t09.dao.UserDao;
import net.guoxin.p03.t09.dao.impl.UserDaoImpl;
import org.junit.Test;

/**

  • 功能:测试用户数据访问接口实现类
  • 作者:郭鑫
  • 日期:2022年06月09日 */ public class TestUserDaoImpl { @Test public void testLogin() { String username = “admin”; String password = “12345”; UserDao dao = new UserDaoImpl(); User user = dao.login(username, password); if (user != null) { System.out.println("恭喜,[" + username + "]登录成功~"); } else { System.out.println("遗憾,[" + username + "]登录失败~"); }} }

-运行testLogin()测试方法

在这里插入图片描述

标签: hadoop big data scala

本文转载自: https://blog.csdn.net/qq_66304440/article/details/125205087
版权归原作者 若小七 所有, 如有侵权,请联系我们删除。

“词频的统计”的评论:

还没有评论