大数据实验 实验四:NoSQL 和关系数据库的操作比较

NoSQL 和关系数据库的操作比较

实验目的

  1. 理解四种数据库(MySQL、HBase、Redis 和 MongoDB)的概念以及不同点;
  2. 熟练使用四种数据库操作常用的 Shell 命令;
  3. 熟悉四种数据库操作常用的 Java API。

实验平台

  1. 操作系统:centos7
  2. Hadoop 版本:3.3;
  3. MySQL 版本:8.0.22;
  4. HBase 版本:2.4.11;
  5. Redis 版本:5.0.5;
  6. MongoDB 版本:5.0;
  7. JDK 版本:1.8;
  8. Java IDE:IDEA;

实验步骤

(一)MySQL 数据库操作

Student 表如表 A-4 所示:

NameEnglishMathComputer
zhangsan698677
lisi5510088
根据上面给出的 Student 表,在 MySQL 数据库中完成如下操作:

(1)在 MySQL 中创建 Student 表,并录入数;
在这里插入图片描述
(2)用 SQL 语句输出 Student 表中的所有记录
在这里插入图片描述
(3)查询 zhangsan 的 Computer 成绩
在这里插入图片描述
(4)修改 lisi 的 Math 成绩,改为 95。

在这里插入图片描述

根据上面已经设计出的 Student 表,使用 MySQL 的 JAVA 客户端编程实现以下操作:

(1)向 Student 表中添加如下所示的一条记录:

package Main;import java.sql.*;import com.mysql.jdbc.Driver;
public class main{static final String  DRIVER="com.mysql.jdbc.Driver";static final String DB="jdbc:mysql://localhost/student?useSSL=false";static final String USER="root";static final String PASSWD="123456";public static void main(String[] args) {Connection conn=null;Statement stmt=null;try {//加载驱动程序Class.forName(DRIVER);System.out.println("Connecting to a selected database...");//打开一个连接conn=DriverManager.getConnection(DB, USER, PASSWD);//执行一个查询stmt=conn.createStatement();String sql="insert into student values('scofield',45,89,100)";stmt.executeUpdate(sql);System.out.println("Inserting records into the table successfully!");} catch (ClassNotFoundException e) {e.printStackTrace();}catch (SQLException e) {e.printStackTrace();}finally{if(stmt!=null)try {stmt.close();} catch (SQLException e) {e.printStackTrace();}if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}

运行结果
在这里插入图片描述

(2) 获取 scofield 的 English 成绩信息

package Main;import java.sql.*;
import com.mysql.jdbc.Driver;
public class main {static final String  DRIVER="com.mysql.jdbc.Driver";static final String DB="jdbc:mysql://localhost/student?useSSL=false";//Database authstatic final String USER="root";static final String PASSWD="root";public static void main(String[] args) {Connection conn=null;Statement stmt=null;ResultSet rs=null;try {Class.forName(DRIVER);System.out.println("Connecting to a selected database...");conn=DriverManager.getConnection(DB, USER, PASSWD);stmt=conn.createStatement();String sql="select name,English from student where name='scofield' ";rs=stmt.executeQuery(sql);System.out.println("name"+"\t\t"+"English");while(rs.next()){System.out.print(rs.getString(1)+"\t\t");System.out.println(rs.getInt(2));}} catch (ClassNotFoundException e) {e.printStackTrace();}catch (SQLException e) {e.printStackTrace();}finally{if(rs!=null)try {rs.close();} catch (SQLException e1) {e1.printStackTrace();}if(stmt!=null)try {stmt.close();} catch (SQLException e) {e.printStackTrace();}if(conn!=null)try {conn.close();} catch (SQLException e) {e.printStackTrace();

运行结果:
在这里插入图片描述

HBase 数据库操作

Student 表如表 A-5 所示。

nameEnglishMathComputer
zhangsan608677
lisi5510088
根据上面给出的学生表 Student 的信息,执行如下操作:

(1)用 Hbase Shell 命令创建学生表 Student
在这里插入图片描述(2)用 scan 指令浏览 Student 表的相关信息
在这里插入图片描述
(3)查询 zhangsan 的 Computer 成绩

在这里插入图片描述
(4)修改 lisi 的 Math 成绩,改为 95
在这里插入图片描述

根据上面已经设计出的 Student 表,用 HBase API 编程实现以下操作:

(1)添加数据

scofield4589100
package Main;import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.HBaseConfiguration;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Table;public class main {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) {// TODO Auto-generated method stubconfiguration  = HBaseConfiguration.create();configuration.set("hbase.rootdir","hdfs://127.0.0.1:8020/hbase");try{connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();}catch (IOException e){e.printStackTrace();}try {insertRow("student","scofield","score","English","45");insertRow("student","scofield","score","Math","89");insertRow("student","scofield","score","Computer","100");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}close();}public static void insertRow(String tableName,String rowKey,String colFamily,String col,String val) throws IOException {Table table = connection.getTable(TableName.valueOf(tableName));Put put = new Put(rowKey.getBytes());put.addColumn(colFamily.getBytes(), col.getBytes(), val.getBytes());table.put(put);table.close();}public static void close(){try{if(admin != null){admin.close();}if(null != connection){connection.close();}}catch (IOException e){e.printStackTrace();}}
}

运行结果
在这里插入图片描述

(2)获取 scofield 的 English 成绩信息

package Main;import java.io.IOException;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.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.Table;public class main {public static Configuration configuration;public static Connection connection;public static Admin admin;public static void main(String[] args) {// TODO Auto-generated method stubconfiguration = HBaseConfiguration.create();configuration.set("hbase.rootdir", "hdfs://127.0.0.1:8020/hbase");try {connection = ConnectionFactory.createConnection(configuration);admin = connection.getAdmin();} catch (IOException e) {e.printStackTrace();}try {getData("student", "scofield", "score", "English");} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}close();}public static void getData(String tableName, String rowKey, String colFamily,String col) throws IOException {Table table = connection.getTable(TableName.valueOf(tableName));Get get = new Get(rowKey.getBytes());get.addColumn(colFamily.getBytes(), col.getBytes());Result result = table.get(get);showCell(result);table.close();}public static void showCell(Result result) {Cell[] cells = result.rawCells();for (Cell cell : cells) {System.out.println("RowName:" + new String(CellUtil.cloneRow(cell)) + " ");System.out.println("Timetamp:" + cell.getTimestamp() + " ");System.out.println("column Family:" + new String(CellUtil.cloneFamily(cell)) + " ");System.out.println("row Name:" + new String(CellUtil.cloneQualifier(cell)) + " ");System.out.println("value:" + new String(CellUtil.cloneValue(cell)) + " ");}}public static void close() {try {if (admin != null) {admin.close();}if (null != connection) {connection.close();}} catch (IOException e) {e.printStackTrace();}}
}

运行结果

在这里插入图片描述

Redis 数据库操作

Student 键值对如下:

zhangsan:{
English: 69
Math: 86
Computer: 77

lisi:{
English: 55
Math: 100
Computer: 88
}

根据上面给出的键值对,完成如下操作:

(1)用 Redis 的哈希结构设计出学生表 Student(键值可以用 student.zhangsan 和student.lisi 来表示两个键值属于同一个表);
在这里插入图片描述
(2)用 hgetall 命令分别输出 zhangsan 和 lisi 的成绩信息;

在这里插入图片描述
(3)用 hget 命令查询 zhangsan 的 Computer 成绩;
在这里插入图片描述
(4)修改 lisi 的 Math 成绩,改为 95
在这里插入图片描述

根据上面已经设计出的学生表 Student,用 Redis 的 JAVA 客户端编程(jedis),实现如下操作:

(1)添加数据:English:69 Math:86 Computer:77
scofield:{
English: 69
Math: 86
Computer: 77

package Main;import java.util.Map;
import redis.clients.jedis.Jedis;public class main {/*** @param args*/public static void main(String[] args) {Jedis jedis = new Jedis("127.0.0.1:6379");jedis.hset("student.scofield", "English","45");jedis.hset("student.scofield", "Math","89");jedis.hset("student.scofield", "Computer","100");Map<String,String>  value = jedis.hgetAll("student.scofield");for(Map.Entry<String, String> entry:value.entrySet()){System.out.println(entry.getKey()+":"+entry.getValue());}}
}2)获取 scofield 的 English 成绩信息
package Main;import java.util.Map;
import redis.clients.jedis.Jedis;public class main {/*** @param args*/public static void main(String[] args) {Jedis jedis = new Jedis("localhost");jedis.hset("student.scofield", "English","45");jedis.hset("student.scofield", "Math","89");jedis.hset("student.scofield", "Computer","100");Map<String,String>  value = jedis.hgetAll("student.scofield");for(Map.Entry<String, String> entry:value.entrySet()){System.out.println(entry.getKey()+":"+entry.getValue());}}
}
(四)MongoDB 数据库操作

Student 文档如下:
{
“name”: “zhangsan”, “score”: {“English”: 69, “Math”: 86, “Computer”: 77}
}

{
“name”: “lisi”, “score”: {“English”: 55, “Math”: 100,“Computer”: 88}
}

根据上面给出的文档,完成如下操作:

(1)用 MongoDB Shell 设计出 student 集合;
在这里插入图片描述

(2)用 find()方法输出两个学生的信息;

在这里插入图片描述

(3)用 find 函数查询 zhangsan 的所有成绩(只显示 score 列)
在这里插入图片描述
(4)修改 lisi 的 Math 成绩,改为 95。
在这里插入图片描述

根据上面已经设计出的 Student 集合,用 MongoDB 的 Java 客户端编程,实现如下操作:

(1)添加数据:English:45 Math:89 Computer:100

与上述数据对应的文档形式如下:
“name”: “scofield”,
“score”: {“English”: 45,“Math”: 89, “Computer”: 100}

package Main;import java.util.ArrayList;
import java.util.List;import org.bson.Document;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;public class main {public static void main(String[] args) {MongoClient mongoClient = new MongoClient("localhost", 27017);MongoDatabase mongoDatabase = mongoClient.getDatabase("student");MongoCollection<Document> collection = mongoDatabase.getCollection("student");Document document = new Document("name", "scofield").append("score", new Document("English", 45).append("Math", 89).append("Computer", 100));List<Document> documents = new ArrayList<Document>();documents.add(document);collection.insertMany(documents);System.out.println("文档插入成功");}
}

在这里插入图片描述

(2)获取 scofield 的所有成绩成绩信息(只显示core)

package Main;import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoCursor;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;public class main {public static void main(String[] args) {MongoClient  mongoClient=new MongoClient("localhost",27017);MongoDatabase mongoDatabase = mongoClient.getDatabase("student");MongoCollection<Document> collection = mongoDatabase.getCollection("student");MongoCursor<Document>  cursor=collection.find( new Document("name","scofield")).projection(new Document("score",1).append("_id", 0)).iterator();while(cursor.hasNext())System.out.println(cursor.next().toJson());}
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/669627.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Linux C++多线程服务器 + Qt上位机开发 + STM32 + 8266WIFI的智慧无人超市

前言 针对传统超市购物车结账排队时间长、付款效率低的问题&#xff0c;提出了一种更符合现代社会人们购物方式-基于RFID的自助收银系统。习惯了快节奏生活的人们都会选择自助收银机结账&#xff0c;理由显而易见&#xff1a;自助收银机结账很方便&#xff0c;几乎不用排队&am…

启发式算法解魔方——python

未完待续&#xff0c;填坑ing…… 魔方操作的表示——辛马斯特标记 辛马斯特标记&#xff08;Singmaster Notation&#xff09;是一种用于描述魔方和类似拼图的转动操作的标记系统。它以大卫辛马斯特&#xff08;David Singmaster&#xff09;的名字命名&#xff0c;辛马斯特…

辐射传输基础理论详解与LST反演方法

地表温度LST(Land Surface Temperature)是区域和全球尺度上陆地表层系统过程的关键参数&#xff0c;它综合了地表与大气的相互作用以及大气和陆地之间能量交换的结果。地表温度作为众多基础学科和应用领域的一个关键参数&#xff0c;能 够提供地表能量平衡状态的时空变化信息&a…

01-JDK安装(Window环境和Linux环境)

1. Windows环境安装JDK 1.1 Oracle官网下载需要版本的JDK 官网传送门https://www.oracle.com/java/technologies/downloads/#java8-windows下载完成之后 以管理员身份&#xff08;管理员&#xff01;管理员&#xff01;&#xff09;运行下载的exe文件 期间修改需要安装的路径…

书生浦语训练营第2期-第6节作业

一、基础作业 1.1 Lagent Web Demo 使用 1.2 AgentLego 直接使用部分 二、进阶作业 2.1 AgentLego WebUI 使用 2.2 使用 Lagent 自定义工具 2.3 使用AgentLego自定义工具

Linux内核中的内联汇编

目录 一、概述 二、内联汇编语法 1、内联汇编常规语法说明 ①、 asm ② 、asm-qualifiers ③ 、AssemblerTemplate ④、 OutputOperands ⑤、 InputOperands ⑥ 、Clobbers 2、内联汇编中的earlyclobber 3、根据语法编写一个简单的add函数 总结 一、概述 C语言在线…

JSON.toJSONString() 输出 “$ref“:“$[0]“问题解决及原因分析

一、背景 在构建一个公共的批处理方法类的时候&#xff0c;在测试输出的时候&#xff0c;打印了" r e f " : " ref":" ref":"[0][0]"的内容&#xff0c;这让我比较疑惑。不由得继续了下去… 二、问题分析 首先&#xff0c;我们需要…

c语言:打印任意行数的菱形

例如&#xff1a;以下图片形式 #include <stdio.h> int main() {int line 0;scanf_s("%d", &line);int i 0;//打印上半部分for (i 0; i < line; i){//打印空格数int j 0;for (j 0; j < line - 1 - i; j){printf(" ");}//打印*数量for…

饥荒服务器搭建centos

服务器环境需要64位32位不可用 uname -r 查看服务器版本 更新yum sudo yum update 安装依赖环境 sudo yum -y install glibc.i686 libstdc.i686 libcurl4-gnutls-dev.i686 libcurl.i686 screen 安装steam cd /home && mkdir steamcmd && cd steamcmd 国…

Istio基础知识

一、什么是Istio Istio 提供⼀种简单的⽅式来为已部署的服务建⽴⽹络&#xff0c;该⽹络具有 负载均衡、服务间认证、监控等功能&#xff0c;只需要对服务的代码进⾏⼀点或不需要做任何改动。想要让服务⽀持 Istio&#xff0c;只需要在您的环境中部署⼀个特殊的 sidecar 代 理&…

【C语言】简单有趣的扫雷游戏

**©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 一、分析游戏规则二、分文件三、菜单实现四、游戏内容核心实现1.初始化棋盘2.打印棋盘3.布置雷4.排查雷5.game()函数实现调用 五、全部源码 一、分…

OpenHarmony实战开发-如何实现动画帧

请求动画帧 请求动画帧时通过requestAnimationFrame函数逐帧回调&#xff0c;在调用该函数时传入一个回调函数。 runframe在调用requestAnimationFrame时传入带有timestamp参数的回调函数step&#xff0c;将step中的timestamp赋予起始的startTime。当timestamp与startTime的差…