完整实验报告word文件:实验四:NoSQL和关系数据库的操作比较
—————————————————————————————————
"大数据技术原理与应用"课程实验报告
题目:实验四:NoSQL和关系数据库的操作比较
姓名:朱小凡
日期:2022/4/17
1、实验环境:
设备名称 华硕-坠机堡垒8
处理器 Intel® Core™ i5-10300H CPU @ 2.50GHz 2.50 GHz
机带 RAM 16.0 GB (15.8 GB 可用)
主机操作系统 Windows 10 家庭中文版
虚拟机操作系统 ubuntukylin-16.04
Hadoop 版本 3.1.3
JDK 版本 1.8
Java IDE:Eclipse
系统类型 64 位操作系统, 基于 x64 的处理器
MySQL:5.7.33-0ubuntu0.16.04.1
Redis:redis-3.2.7
MongoDB:2.6.10
2、实验内容与完成情况:
1、MySQL数据库操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9jlqWaA5-1651817958932)(media/image1.png)]{width=“6.0in” height=“1.5916666666666666in”}
(1) 根据上面给出的Student表,在 MySQL数据库中完成如下操作。
1、在MySQL中创建Student表,并录入数据。
SQL语句:
- create table Student (
Name varchar(30) NOT NULL,
English TINYINT,
Math TINYINT,
Computer TINYINT
);
-
insert into Student values (“zhangsan”,69,86,77);
-
insert into Student values
(“lisi”,55,100,88);[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NBcCyf3V-1651817958933)(media/image2.png)]{width=“6.0in”
height=“2.20625in”}
图1、创建Student表
2、用SQL语句输出Student表中的所有记录。
SQL语句:
select * from Student;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W59XcT2S-1651817958933)(media/image3.png)]{width=“3.441965223097113in”
height=“1.2334405074365704in”}
图2、查询Student表
3、查询zhangsan的Computer成绩。
SQL语句:
select name , Computer from Student where name =“zhangsan”;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E74MjyN5-1651817958934)(media/image4.png)]{width=“5.125444006999125in”
height=“1.0250885826771654in”}
图3、查询zhangsan的Computer成绩
4、修改lisi的 Math成绩,改为95。
SQL语句:
update Student set Math=95 where name = “lisi”;
select name , Math from Student where name =“lisi”;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETTj8MLW-1651817958934)(media/image5.png)]{width=“4.925426509186352in”
height=“1.7584853455818024in”}
图4、修改lisi的 Math成绩,改为95
(2)根据上面已经设计出的
Student表,使用MySQL的Java客户端编程实现以下操作。
1、向Student表中添加如下所示的一条记录:
2、获取scofield的 English成绩信息。
java代码:
1. **import** java.sql.\*;
2. **public** **class** MySQLExample
3. {
4.
5. **static** **final** String JDBC_DRIVER = \"com.mysql.jdbc.Driver\";
6. **static** **final** String DB_URL = \"jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC\"; //Student是数据库名
7. **static** **final** String USER = \"root\";
8. **static** **final** String PASS = \"123456\";
9.
10. //添加一行记录
11. **public** **static** **void** addRecord(Connection conn,String sql,String name,**int** english,**int** math,**int** computer)
12. {
13. PreparedStatement ps;
14. **try**
15. {
16. ps = conn.prepareStatement(sql);
17. ps.setString(1, name);
18. ps.setInt(2, english);
19. ps.setInt(3, math);
20. ps.setInt(4, computer);
21. ps.executeUpdate();
22. System.out.println(\"添加成功!\");
23. ps.close();
24. } **catch** (SQLException e)
25. {
26. e.printStackTrace();
27. }
28. }
29. //sql :select \* from student where name = name
30. **public** **static** **void** Search(Connection conn,String sql,String name,String score)
31. {
32. PreparedStatement ps;
33. **try**
34. {
35. ps = conn.prepareStatement(sql);
36. ps.setString(1, name);
37. ResultSet rs = ps.executeQuery();
38. **while**(rs.next())
39. {
40. System.out.print(name+\":\"+score+\":\");
41. System.out.println(rs.getInt((score)));
42. }
43. rs.close();
44. ps.close();
45. } **catch** (SQLException e)
46. {
47. e.printStackTrace();
48. }
49. }
50. **public** **static** **void** main(String\[\] args)
51. {
52. //main方法可以根据后面截图修改(应该只需要取消或增加相应注释)
53. Connection conn = **null**;
54. **try**{
55. Class.forName(JDBC_DRIVER);
56. System.out.println(\"连接数据库\...\");
57. conn = DriverManager.getConnection(DB_URL,USER,PASS);
58. System.out.println(\" 实例化Statement对象\...\");
59. // String sql = \"INSERT INTO Student VALUES(?,?,?,?);\";
60. // addRecord(conn,sql, \"scofield\", 45, 89, 100);
61. String sql = \"SELECT \* FROM Student WHERE Name = ?;\";
62. Search(conn, sql, \"scofield\", \"English\");
63. conn.close();
64. }**catch**(SQLException se)
65. {
66. se.printStackTrace();
67. }**catch**(Exception e)
68. {
69. e.printStackTrace();
70. }**finally**
71. {
72. **try**
73. {
74. **if**(conn!=**null**) conn.close();
75. }**catch**(SQLException se)
76. {
77. se.printStackTrace();
78. }
79. }
80. System.out.println(\"Goodbye!\");
81. }
82. }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lpbwu94T-1651817958934)(media/image6.png)]{width=“6.0in” height=“3.420138888888889in”}
图5、MySQL添加记录(java)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASTF55ow-1651817958935)(media/image7.png)]{width=“5.350463692038495in”
height=“4.417049431321085in”}
图6、MySQL查询记录(java)
2、HBase数据库操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z9yqBZFF-1651817958935)(media/image8.png)]{width=“6.0in” height=“1.7958333333333334in”}
(1)根据上面给出的Student表的信息,执行如下操作。
1)用HBase Shell命令创建学生表Student。
2)用scan指令浏览Student表的相关信息。
Shell命令以及运行结果如图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FZ9Xk8Gs-1651817958935)(media/image9.png)]{width=“6.0in” height=“4.872916666666667in”}
图7、HBase建Student表
3)查询zhangsan的Computer成绩。
4)修改lisi的Math成绩,改为95。
Shell命令:
get ‘Student’,‘1’,‘score:Computer’
put ‘Student’,‘2’,‘score:Math’,95
get ‘Student’,‘2’
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-glQIcUjY-1651817958936)(media/image10.png)]{width=“5.350463692038495in”
height=“2.3418700787401576in”}
图8、HBase查询修改记录
(2)根据上面已经设计出的Student表,用HBase API编程实现以下操作。
1)添加数据:English为45 ;Math为89;Computer 为 100。
2)获取scofield的English成绩信息。
java代码:
1. **import** org.apache.hadoop.conf.Configuration;
2. **import** org.apache.hadoop.hbase.\*;
3. **import** org.apache.hadoop.hbase.client.\*;
4. **import** java.io.IOException;
5. **import** java.util.ArrayList;
6. **import** java.util.Map;
7. **public** **class** HbaseExample{
8. **public** **static** Configuration configuration;
9. **public** **static** Connection connection;
10. **public** **static** Admin admin;
11. **public** **static** **void** init()
12. {
13. configuration = HBaseConfiguration.create();
14. configuration.set(\"hbase.rootdir\",\"hdfs://localhost:9000/hbase\");
15. **try**
16. {
17. connection = ConnectionFactory.createConnection(configuration);
18. admin = connection.getAdmin();
19. }**catch** (IOException e)
20. {
21. e.printStackTrace();
22. }
23. }
24. **public** **static** **void** close()
25. {
26. **try**{
27. **if**(admin != **null**)
28. {
29. admin.close();
30. }
31. **if**(**null** != connection)
32. {
33. connection.close();
34. }
35. }**catch** (IOException e)
36. {
37. e.printStackTrace();
38. }
39. }
40. **public** **static** **void** addRecord(String tableName,String row,String\[\] fields,String\[\] values) **throws** IOException
41. {
42. init();
43. Table table = connection.getTable(TableName.valueOf(tableName));
44. Put put = **new** Put(row.getBytes());
45. **int** count = 0;
46. **for** (String str:fields)
47. {
48. String\[\] temp = str.split(\":\");
49. String colFamily = temp\[0\];
50. String col = temp.length == 2 ? temp\[1\] : \"\";
51. put.addColumn(colFamily.getBytes(), col.getBytes(), values\[count\].getBytes());
52. count++;
53. }
54. table.put(put);
55. table.close();
56. close();
57. System.out.println(\"addRecord success\");
58. }
59. **public** **static** **void** main(String\[\] args)**throws** IOException
60. {
61. //main方法可以根据后面截图修改(应该只需要取消或增加相应注释)
62. String tableName = \"Student\";
63. // String\[\] fields = {\"name\",\"score:English\",\"score:Math\",\"score:Computer\"};
64. // String\[\] values = {\"scofield\",\"45\",\"89\",\"100\"};
65. // addRecord(tableName, \"3\", fields, values);
66.
67. init(); //第二题的,做第二题的时候这个不能注掉
68. **try**
69. {
70. Table table = connection.getTable(TableName.valueOf(tableName));
71. Get g = **new** Get(\"3\".getBytes());
72. g.addColumn(\"score\".getBytes(),\"English\".getBytes());
73. Result re = table.get(g);
74. Cell[] cells = re.rawCells();
75. **for**(Cell cell:cells)
76. {
77. System.out.print(\"column Family:\"+**new** String(CellUtil.cloneFamily(cell))+\" \");
78. System.out.print(\"row Name:\"+**new** String(CellUtil.cloneQualifier(cell))+\" \");
79. System.out.println(\"value:\"+**new** String(CellUtil.cloneValue(cell))+\" \");
80. }
81. } **catch** (Exception e)
82. {
83. e.printStackTrace();
84. }
85. }
86. }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xk6vlVKs-1651817958936)(media/image11.png)]{width=“6.0in” height=“4.428472222222222in”}
图9、HBase查询修改记录(java)
3、Redis数据库操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uu5VYOwC-1651817958936)(media/image12.png)]{width=“5.283791557305337in”
height=“3.700320428696413in”}
(1)根据上面给出的键值对,完成如下操作。
1)用Redis的哈希结构设计出学生表Student(键值可以用student.zhangsan和student.lisi来表示两个键值属于同一个表)。
2)用hgetall命令分别输出zhangsan和 lisi的成绩信息。
Shell命令:
hset Student.zhangsan English 69
hset Student.zhangsan Math 86
hset Student.zhangsan Computer 77
hset Student.lisi English 55
hset Student.lisi Math 100
hset Student.lisi Computer 88
hgetall Student.zhangsan
hgetall Student.lisi
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N6oVv1Dn-1651817958937)(media/image13.png)]{width=“6.0in” height=“4.236805555555556in”}
图10、Redis添加与查询记录
3)用hget命令查询zhangsan的 Computer成绩。
4)修改lisi的Math成绩,改为95。
Shell命令:
hget Student.zhangsan Computer
hset Student.lisi Math 95
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FfqdPoGR-1651817958937)(media/image14.png)]{width=“4.3170406824146985in”
height=“1.258442694663167in”}
图11、Redis查询与修改记录
(2)根据上面已经设计出的学生表Student,用Redis的Java客户端编程(jedis),实现如下操作。
1)添加数据:English:45 Math:89 Computer:100
2)获取 scofield 的 English 成绩信息
java代码:
1. **import** java.util.Map;
2. **import** redis.clients.jedis.Jedis;
3. **public** **class** RedisExample
4. {
5. **public** **static** **void** main(String\[\] args)
6. {
7. //连接本地的 Redis 服务
8. Jedis jedis = **new** Jedis(\"localhost\");
9. System.out.println(\"连接成功\");
10. jedis.hset(\"Student.scofield\", \"English\", \"45\");
11. jedis.hset(\"Student.scofield\", \"Math\", \"89\");
12. jedis.hset(\"Student.scofield\", \"Computer\",\"100\");
13. System.out.println(\"数据添加成功!\");
14. // String re = jedis.hget(\"Student.scofield\", \"English\");
15. // System.out.println(re);
16. Map\<String,String\> value = jedis.hgetAll(\"Student.scofield\");
17. **for**(Map.Entry\<String, String\> entry:value.entrySet())
18. {
19. System.out.println(entry.getKey()+\": \"+entry.getValue());
20. }
21. }
22. }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxatqxCc-1651817958937)(media/image15.png)]{width=“6.0in” height=“5.0in”}
图12、Redis添加和查询记录(java)
4、MongoDB数据库操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AUFvgiuj-1651817958938)(media/image16.png)]{width=“6.0in” height=“3.1666666666666665in”}
(1)根据上面给出的文档,完成如下操作。
1)用MongoDB Shell设计出student集合。
2)用find()方法输出两个学生的信息。
Shell命令:
-
use Student
-
var stus=[{“name”:“zhangsan”,“scores”:{“English”:69,“Math”:86,“Computer”:77}},{“name”:“lisi”,“scores”:{ “English”:55,“Math”:100,“Computer”:88}}]
-
db.Student.insert(stus)
-
db.Student.find().pretty()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dRv73Uxl-1651817958938)(media/image17.png)]{width=“6.0in” height=“5.322916666666667in”}
图13、MongoDB添加和查询记录
3)用find函数查询zhangsan的所有成绩(只显示 score列)。
4)修改lisi的Math 成绩,改为95。
Shell命令:
db.Student.find({“name”:“zhangsan”},{“_id”:0,“name”:0})
db.Student.update({“name”:“lisi”},{“$set”:{“scores.Math”:95}})
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZc9UGz6-1651817958938)(media/image18.png)]{width=“6.0in” height=“2.470833333333333in”}
图14、MongoDB查询和修改记录
(2)根据上面已经设计出的Student集合,用MongoDB的Java客户端编程,实现如下操作:
1)添加数据:English:45 Math:89 Computer:100
2)获取scofield的所有成绩成绩信息(只显示score列)
java代码:
1. **import** java.util.ArrayList;
2. **import** java.util.List;
3.
4. **import** org.bson.Document;
5. **import** com.mongodb.MongoClient;
6. **import** com.mongodb.client.MongoCollection;
7. **import** com.mongodb.client.MongoDatabase;
8. **import** com.mongodb.client.MongoCursor;
9.
10. **public** **class** MongodbExample{
11.
12. /\*\*
13. \* @author hadoop
14. \*/
15.
16. **public** **static** **void** main(String\[\] args) {
17. //实例化一个mongo客户端
18. MongoClient mongoClient = **new** MongoClient(\"localhost\",27017);
19. //实例化一个mongo数据库
20. MongoDatabase mongoDatabase = mongoClient.getDatabase(\"Student\");
21. //获取数据库中的某个集合
22. MongoCollection\<Document\> collection = mongoDatabase.getCollection(\"Student\");
23.
24. // //第一题:添加数据
25. // //实例化一个文档,内嵌一个子文档
26. // Document document = new Document(\"name\",\"scofield\").append(\"scores\", new Document(\"English\",45).append(\"Math\", 89).append(\"Computer\", 100));
27. // List\<Document\> documents = new ArrayList\<Document\>();
28. // documents.add(document);
29. // //将文档插入集合中
30. // collection.insertMany(documents);
31. // System.out.println(\"文档插入成功!\");
32.
33. //第二题:获取scofield的所有成绩信息
34. //进行数据查找,查询条件为name=scofield,对获取的结果集只显示score这个域
35. MongoCursor\<Document\> cursor = collection.find(**new** Document(\"name\",\"scofield\")).projection(**new** Document(\"scores\",1).append(\"\_id\", 0)).iterator();
36. **while**(cursor.hasNext())
37. System.out.println(cursor.next().toJson());
38.
39. }
40. }
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kYOfk1he-1651817958938)(media/image19.png)]{width=“6.0in” height=“3.1597222222222223in”}
图15、MongoDB添加和查询记录(java)
3、出现的问题:
1、启动MySQL数据库的时候报错:ERROR 2002 (HY000): Can’t connect to
local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)
4、解决方案:
1、https://blog.csdn.net/Aria_Miazzy/article/details/92803246