大数据技术ubuntu -- NoSQL和关系数据库的操作比较

一、实验目的

(1)理解四种数据库(MySQL、HBase、Redis和MongoDB)的概念以及不同点;

(2)熟练使用四种数据库操作常用的Shell命令;

(3)熟悉四种数据库操作常用的Java API。

二、实验平台

(1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04);

(2)Hadoop版本:3.1.3;

(3)MySQL版本:5.6;

(4)HBase版本:2.2.2;

(5)Redis版本:5.0.5;

(6)MongoDB版本:4.0.16;

(7)JDK版本:1.8;

(8)Java IDE:Eclipse;

三、实验内容

(一) MySQL数据库操作

(二)HBase数据库操作

(三)Redis数据库操作

(四)MongoDB数据库操作

四、实验过程、内容

更新资源包。

1)MySQL版本:5.6;

1.安装MySQL

执行以下命令将mysql解压至“/usr/local/”目录下并重命名,并将目录的权限赋予hadoop用户:

安装MySQL:

查看MySQL的安装状态,以下表示成功安装:

2.密码查询及更改

若安装过程未设置密码或者设置了密码然后使用过程中忘记密码了,可以通过以下方式查询、修改密码。

首先使用以下命令查询当前的用户及密码,

  1. sudo cat /etc/mysql/debian.cnf

然后,输入mysql -u debian-sys-maint -p会提示输入密码,此处输入的密码就是上一步的结果图中绿框里的密码。

然后就可以修改密码了,mysql8.04以后的版本执行下述语句:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';

修改完密码之后就可以使用下述语句进入mysql shell了

$ mysql -u root -p

该步执行后会提示你输入密码,输入你刚才更改的密码就可以进入mysql shell了。显示mysql>就证明可以使用mysql了。

2)Redis版本:5.0.5;

访问Redis官网(http://www.redis.cn/)下载安装包redis-5.0.5.tar.gz

执行以下命令将Redis解压至“/usr/local/”目录下并重命名

然后,执行如下命令把redis目录的权限赋予hadoop用户:

接下来,进入“/usr/local/redis”目录,输入以下命令编译和安装Redis:

至此,Redis已经安装完成,现在可以执行如下命令开启Redis服务器

然后,再新建一个终端,输入如下命令启动Redis客户端

3)MongoDB版本:4.0.16;

MongoDB既可以安装在Windows系统下使用,也可以安装在Linux系统下使用,这里采用Linux系统。MongoDB安装很简单,无需下载源文件,可以直接用apt-get命令进行安装。

但是,需要说明的是,如果直接使用“sudo apt-get install mongodb”命令进行安装,默认安装的版本是MongoDB 2.6.10。由于目前MongoDB已经升级到4.0.16,这里将通过添加软件源的方式来安装4.0.16版本。

首先,在Linux系统中打开一个终端,执行如下命令导入公共秘钥到包管理器中:

然后,创建MongoDB的文件列表,命令如下:

#对于Ubuntu18.04,使用如下命令:

$ echo "deb [ arch=amd64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list

#对于Ubuntu16.04,使用如下命令:

$ echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/4.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb.list

执行如下命令来更新包管理器:

最后,执行如下命令安装MongoDB:

安装完成后,在终端输入以下命令查看MongoDB版本:

注:如果能够输出版本信息(如图6-8所示),则表明安装成功

默认设置下,MongoDB是随Ubuntu启动而自动启动的。可以输入以下命令查看是否启动成功:

进入mongo shell:

使用MongoDB结束后,关闭MongoDB的命令如下:

$ sudo service mongod stop

五、实验结果(运行结果截图)

(一) MySQL数据库操作

学生表如14-7所示。

表14-7 学生表Student

Name

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

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

  1. MySQL中创建Student表,并录入数据;

  1. SQL语句输出Student表中的所有记录;

  1. 查询zhangsan的Computer成绩

(4)修改lisi的Math成绩改为95

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

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

scofield

45

89

100

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

3)Student表,使用MySQL的JAVA客户端编程实现代码:

//--------Student.java-------//
public class Student {//创建一个Student实体类
private String Name;
private int English;
private int Math;
private int Computer;

public String getName() {
return Name;
}
public void setName(String Name) {
this.Name=Name;
}

public int getEnglish() {
return English;
}
public void setEnglish(int English) {
this.English=English;
}

public int getMath() {
return Math;
}
public void setMath(int Math) {
this.Math=Math;
}

public int getComputer() {
return Computer;
}
public void setComputer(int Computer) {
this.Computer=Computer;
}

public Student() {
}
public Student(String Name, int English, int Math, int Computer) {
super();
this.Name = Name;
this.English = English;
this.Math = Math;
this.Computer = Computer;
}
}
 
 
 
 
 

//--------DBUtil.java-------//
import java.sql.*;

public class DBUtil {

private static Connection conn;

public static Connection getConnection() throws SQLException {//获取到数据库demo的连接
if(null != conn) return conn;
try {
Class.forName("com.mysql.jdbc.Driver");//加载JDBC驱动(连接MySQL数据库)
}catch(ClassNotFoundException e) {
System.out.println(e.getMessage());
}
String url = "jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false";//数据库位于本机
conn = DriverManager.getConnection(url, "root", "123");
return conn;
}

public static void closeConnection()  throws SQLException {
if(null != conn)
conn.close();
}

}
 
 
 
//--------StudentDAO.java-------//
package StudentConcenct;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.mysql.jdbc.Connection;

public class StudentDAO {
public List<Student> getAllStudents()  throws SQLException {//查询所有的学生的信息
String sql = "SELECT * from Student";
Connection conn = (Connection) DBUtil.getConnection();//
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
List<Student> list = new ArrayList<Student>();
while(rs.next()) {
//int id = rs.getInt(1);  //
String Name = rs.getString("Name");
int English = rs.getInt("English");
int Math = rs.getInt("Math");
int Computer = rs.getInt("Computer");
String str = String.format("Name:%s English:%d Math:%d Computer:%d",
Name, English, Math, Computer);
System.out.println(str);
Student stu = new Student();
stu.setName(Name);
stu.setEnglish(English);
stu.setMath(Math);
stu.setComputer(Computer);
list.add(stu);
}
return list;
}

public int insert(Student student) throws SQLException {//往数据库插入特定记录
String sql = "insert into Student values (?, ?, ?, ?)";
//System.out.println(sql);
Connection conn = (Connection) DBUtil.getConnection();//
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, student.getName());
pstmt.setInt(2, student.getEnglish());
pstmt.setInt(3, student.getMath());
pstmt.setInt(4, student.getComputer());
int cnt = pstmt.executeUpdate();
if(cnt<=0) {
System.out.println("插入记录不成功。");
}
else {
System.out.println("成功插入 "+cnt+" 条记录。");
}
return cnt;
}

public Student getStudentByName(String Name) throws SQLException{//根据姓名查询学生的English信息
String sql = "SELECT English from Student where name = '"+ Name +"' ";
Connection conn = (Connection) DBUtil.getConnection();//
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()) {
int English = rs.getInt("English");
String str = String.format("English:%d",English );
System.out.println(str);
Student stu = new Student();
stu.setName(Name);
stu.setEnglish(English);
break;
}
return null;
}

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StudentDAO dao = new StudentDAO();
try {


System.out.println("插入一条学生信息");
dao.insert(new Student("scofield",45,89,100));
System.out.printf("\n");

System.out.println("查询所有学生信息");
dao.getAllStudents();
System.out.println();

System.out.println("查找姓名为scofield的English成绩:");
dao.getStudentByName("scofield");

}
catch(SQLException e) {
e.printStackTrace();
}
finally {
try {
DBUtil.closeConnection();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}


}
 

(二)HBase数据库操作

学生表Student如表14-8所示。

表14-8 学生表Student

     name

score

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

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

(1) 用Hbase Shell命令创建学生Student;

create 'Student','score'

put 'Student','zhangsan','score:English','69'
put 'Student','zhangsan','score:Math','86'
put 'Student','zhangsan','score:Computer','77'
put 'Student','lisi','score:English','55'
put 'Student','lisi','score:Math','100'
put 'Student','lisi','score:Computer','88'

(2)用scan命令浏览Student表的相关信息

(3)查询zhangsanComputer成绩

(4)修改lisiMath成绩,为95

2.根据上面已经设计出的StudentHBase API编程实现以下操作:

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

scofield

45

89

100

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

3)Student表,使用Hbase的JAVA客户端编程实现代码:

import org.apache.hadoop.conf.Configuration;

import org.apache.hadoop.hbase.*;

import org.apache.hadoop.hbase.client.*;

import org.apache.hadoop.hbase.util.Bytes;



import java.io.IOException;

public class StudentOperation {

    public static Configuration configuration;

    public static Connection connection;

    public static Admin admin;

    public static void main(String[] args)throws IOException{

        init();

        insertData("Student","scofield","score","English","69");

        insertData("Student","scofield","score","Math","8");

        insertData("Student","scofield","score","Computer","");

        getData("Student", "scofield", "score","English");

        close();

    }



    public static void init(){

        configuration  = HBaseConfiguration.create();

        configuration.set("hbase.rootdir","hdfs://localhost:9000/hbase");

        try{

           connection = ConnectionFactory.createConnection(configuration);

   admin = connection.getAdmin();

        }catch (IOException e){

            e.printStackTrace();

        }

    }



    public static void close(){

        try{

            if(admin != null){

               admin.close();

           }

            if(null != connection){

                connection.close();

           }

        }catch (IOException e){

            e.printStackTrace();

        }

    }



  



   public static void insertData(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 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);

        System.out.println(new String(result.getValue(colFamily.getBytes(),col==null?null:col.getBytes())));

        table.close();

    }

}

(三)Redis数据库操作

Student键值对如下:

zhangsan:{

English: 69

Math: 86

Computer: 77

lisi:{

English: 55

Math: 100

Computer: 88

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

(1)用Redis的哈希结构设计出学生表Student(键值可以student.zhangsanstudent.lisi来表示两个键值属于同一个表);

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

(2)用hgetall命令分别输出zhangsan和lisi的成绩信息

(3)用hget命令查询zhangsanComputer成绩

(4)修改lisiMath成绩,为95。

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

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

该数据对应的键值对形式如下:

scofield:{

English: 45

Math: 89

Computer: 100

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

3)Student表,使用Hbase的JAVA客户端编程实现代码:

package StudentConn;



import java.util.Map;

import redis.clients.jedis.Jedis;

public class RedisTest {

public static Jedis jedis;

public static void main(String[] args) {

// TODO Auto-generated method stub

jedis = new Jedis("localhost");

//插入数据

test1();

//查询数据a

test2();

}

public static void test1() {

// TODO Auto-generated method stub

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());

}

}



public static void test2() {

// TODO Auto-generated method stub

String value=jedis.hget("student.scofield", "English");

System.out.println("scofield's English score is:    "+value);

}

}

(四)MongoDB数据库操作

Student文档如下:

{

“name”: “zhangsan”,

“score”: {

“English”: 69,

“Math”: 86,

“Computer”: 77

}

}

{

“name”: “lisi”,

“score”: {

“English”: 55,

“Math”: 100,

“Computer”: 88

}

}

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

(1)用MongoDB Shell设计出student集合

切换到Student集合:

插入数据:

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

(3)用find()方法查询zhangsan所有成绩(只显示score列)

(4)修改lisiMath成绩,为95。

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

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

与上述数据对应的文档形式如下:

{

“name”: “scofield”,

“score”: {

“English”: 45,

“Math”: 89,

“Computer”: 100

}

}

   

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

3)Student表,使用Hbase的JAVA客户端编程实现代码:

package StudentConn;



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;

import com.mongodb.client.MongoCursor;



public class mongoTest {



/**

 * @param args

 */

public static MongoClient  mongoClient;

public static MongoDatabase mongoDatabase;

public static MongoCollection<Document> collection;



public static void main(String[] args) {

// TODO Auto-generated method stub

init();

//插入数据

test1();

//查询数据

test2();



}



public static void test1() {

// TODO Auto-generated method stub

//实例化一个文档,内嵌一个子文档

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("文档插入成功");

}



public static void test2() {

// TODO Auto-generated method stub

//进行数据查找,查询条件为name=scofield, 对获取的结果集只显示score这个域

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());

}



public static void init() {

// TODO Auto-generated method stub

//实例化一个mongo客户端

 mongoClient=new MongoClient("localhost",27017);

//实例化一个mongo数据库

mongoDatabase = mongoClient.getDatabase("Student");

//获取数据库中某个集合

collection = mongoDatabase.getCollection("Student");

}



}

六、实验心得和总结

(列出遇到的问题和解决办法,列出没有解决的问题,可以是个人相关知识点总结,要求150字以上)

问题一:运行Student表,使用Redis的JAVA客户端编程实现代码时,出现:

解决方法:出现这种情况很有可能时你在连接时没有开启redis服务,执行如下命令开启redis服务:

然后再开启一个终端执行实现代码。

如果确保已经开启了 redis服务,仍然报出上述错误,可以考虑修改redis配置文件redis.conf,

或者关闭防火墙等。

  • 7
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值