淘先锋技术网

首页 1 2 3 4 5 6 7

完整实验报告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语句:

  1. create table Student (

Name varchar(30) NOT NULL,

English TINYINT,

Math TINYINT,

Computer TINYINT

);

  1. insert into Student values (“zhangsan”,69,86,77);

  2. 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命令:

  1. use Student

  2. var stus=[{“name”:“zhangsan”,“scores”:{“English”:69,“Math”:86,“Computer”:77}},{“name”:“lisi”,“scores”:{ “English”:55,“Math”:100,“Computer”:88}}]

  3. db.Student.insert(stus)

  4. 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