大数据实验

发布时间 2023-12-25 17:36:20作者: 布吉岛???

实验1

熟悉常用的Linux操作Hadoop操作

1.实验目的

Hadoop运行在Linux系统上,因此,需要学习实践一些常用的Linux命令。本实验旨在熟悉常用的Linux操作Hadoop操作,为顺利开展后续其他实验奠定基础

2.实验平台

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

2Hadoop版本:3.1.3

3.实验步骤

1.熟悉常用的Linux操作

1cd命令:切换目录

(1) 切换到目录“/usr/local”

cd /usr/local

(2) 切换当前目录的上一级目录

cd ..

(3) 切换到当前登录Linux系统的用户的自己的主文件夹

cd ~

2ls命令:查看文件与目录

查看目录“/usr”所有文件和目录

3mkdir命令:新建目录

1进入“/tmp”目录,创建一个名为“a”的目录并查看“/tmp”目录下已经存在哪些目录

2)进入“/tmp”目录,创建目录“a1/a2/a3/a4” 

4rmdir命令:删除空的目录

1)将上面创建的目录a/tmp”目录下面)删除

2)删除上面创建的目录“a1/a2/a3/a4” /tmp”目录下面),然后查看“/tmp”目录下面存在哪些目录

5cp命令:复制文件或目录

1)将当前用户的主文件夹下的文件.bashrc复制到目录/usr”下,并重命名为bashrc1

2)在目录/tmp”下新建目录test,再把这个目录复制“/usr”目录下

6mv命令:移动文件与目录,或更名

1)将/usr”目录下的文件bashrc1移动到“/usr/test”目录

2)将“/usr”目录下的test目录重命名为test2

7rm命令:移除文件或目录

1)将“/usr/test2”目录下bashrc1文件删除

2)将“/usr”目录下的test2目录删除

8cat命令:查看文件内容

查看当前用户主文件夹下的.bashrc文件内容

9tac命令:反向查看文件内容

反向查看当前用户主文件夹下的.bashrc文件内容

10more命令:一页一页翻动查看

翻页查看当前用户主文件夹下的.bashrc文件内容

11head命令:取出前面几行

1)查看当前用户主文件夹下.bashrc文件内容前20

2)查看当前用户主文件夹下.bashrc文件内容,后面50行不显示,只显示前面几行

12tail命令:取出后面几行

1)查看当前用户主文件夹下.bashrc文件内容最后20

2)查看当前用户主文件夹下.bashrc文件内容,并且只列出50行以后的数据

13touch命令:修改文件时间或创建新文件

1)在“/tmp”目录下创建一个空文件hello,并查看文件时间

2)修改hello文件,将文件时间整为5天前

14chown命令:修改文件所有者权限

hello文件所有者改为root帐号,并查看属性

15find命令:文件查找

找出主文件夹下文件名为.bashrc的文件

16tar命令:压缩命令

1)在目录“/”下新建文件夹test,然后在根目录/”下打包成test.tar.gz

2把上面的test.tar.gz压缩包,解压缩到“/tmp”目录

17grep命令:查找字符串

/.bashrc”文件中查找字符串'examples'

18)配置环境变量

1/.bashrc”中设置配置Java环境变量

2)查看JAVA_HOME变量的值

2.熟悉常用的Hadoop操作

1使用hadoop用户登录Linux系统,启动HadoopHadoop的安装目录为“/usr/local/hadoop”)hadoop用户HDFS中创建用户目录/user/hadoop

2)接着在HDFS目录/user/hadoop”下,创建test文件夹,并查看文件列表

3)将Linux系统本地的“/.bashrc”文件上传到HDFStest文件夹,并查看test

4HDFS文件夹test复制到Linux系统本地文件系统的“/usr/local/hadoop”目录下

 

4.实验报告

题目:

熟悉常用的Linux操作和Hadoop操作

姓名:

粘艺凡

日期:

2023/11/7

实验环境:vmware虚拟机环境,centos

实验内容与完成情况:

  1. cd /usr/local
  2. cd ..
  3. cd ~

         

  1. cd /usr
  2. Ls

 

  1. cd /tmp
  2. Mkdir a
  3. Ls
  4. Mkdir -p a1/a2/a3/aa4

10.Cd a1/a2/a3/a4

    

  1. cd /tmp
  2. rmdir -v a
  3. rmdir -vp a1/a2/a3/a4

 

  1. 注意权限问题,以及注意格式/和空格

 

要注意现在处于的文件位置

 

注意确认y或者n

 

cat命令

 

tac命令

 

more命令

 

head命令(文件可能没东西)

 

tail命令

 

touch命令(要注意时间的格式)

 

chown命令

 

findtar命令

 

grep命令(bashrc文件中空)

 

 

hadoop操作,(hadoop操作是直接在虚拟机中操作的,所以背景不同)

 

 

 

 

出现的问题:主要就是权限问题,别的没有了

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

主要就是权限问题,一开始设置的默认是hadoop,然后在执行命令的时候有的用不了,换成了root之后解决

 


实验2

熟悉常用的HDFS操作

 

 

1.实验目的

1理解HDFSHadoop体系结构中的角色;

2熟练使用HDFS操作常用的Shell命令;

3熟悉HDFS操作常用的Java API

2. 实验平台

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

2Hadoop版本:3.1.3

3JDK版本:1.8

4Java IDEEclipse

3. 实验步骤

(一)编程实现以下功能,并利用Hadoop提供的Shell命令完成相同任务:

HDFS中上传任意文本文件,如果指定的文件在HDFS中已经存在,则由用户来指定是追加到原有文件末尾还是覆盖原有的文件;

HDFS中下载指定文件,如果本地文件与要下载的文件名称相同,则自动对下载的文件重命名;

HDFS中指定文件的内容输出到终端中;

显示HDFS中指定的文件的读写权限、大小、创建时间、路径等信息;

给定HDFS中某一个目录,输出该目录下的所有文件的读写权限、大小、创建时间、路径等信息,如果该文件是目录,则递归输出该目录下所有文件相关信息;

提供一个HDFS内的文件的路径,对该文件进行创建和删除操作。如果文件所在目录不存在,则自动创建目录;

 

提供一个HDFS的目录的路径,对该目录进行创建和删除操作。创建目录时,如果目录文件所在目录不存在,则自动创建相应目录;删除目录时,由用户指定当该目录不为空时是否还删除该目录;

HDFS中指定的文件追加内容,由用户指定内容追加到原有文件的开头或结尾;

删除HDFS中指定的文件;

HDFS中,将文件从源路径移动到目的路径。

 

(二)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。

(三)查看Java帮助手册或其它资料,用“java.net.URL”“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。

 

4.实验报告

题目:

熟悉常用的HDFS操作

 

姓名

粘艺凡

日期

2023.11.14

实验环境:vmware虚拟机环境,centos

实验内容与完成情况:

该图片中出现的问题是datanote问题,全部启动之后已经解决

 

 

 

 

 

 

(二)编程实现一个类“MyFSDataInputStream”,该类继承“org.apache.hadoop.fs.FSDataInputStream”,要求如下:实现按行读取HDFS中指定文件的方法“readLine()”,如果读到文件末尾,则返回空,否则返回文件一行的文本。

(三)查看Java帮助手册或其它资料,用“java.net.URL”“org.apache.hadoop.fs.FsURLStreamHandlerFactory”编程完成输出HDFS中指定文件的文本到终端中。

 

 

 

 

 

 

 

出现的问题:1.将文件追加到hdfs文件中报错

 

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):1.原因是datanote的问题,电脑有三个节点,一台出问题,就无法成功。将三台datanote都打开之后就可以正常将文件追加到hdfs文件中

 

 

实验3

熟悉常用的HBase操作

 

 

1.实验目的

1理解HBaseHadoop体系结构中的角色;

2熟练使用HBase操作常用的Shell命令;

3熟悉HBase操作常用的Java API

2.实验平台

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

2Hadoop版本:3.1.3

3HBase版本:2.2.2

4JDK版本:1.8

5Java IDEEclipse

3. 实验步骤

(一)编程实现以下指定功能,并用Hadoop提供的HBase Shell命令完成相同任务:

列出HBase所有的表的相关信息,例如表名;

在终端打印出指定的表的所有记录数据;

向已经创建好的表添加和删除指定的列族或列;

清空指定的表的所有记录数据;

统计表的行数。

 

(二)HBase数据库操作

1. 现有以下关系型数据库中的表和数据(见表14-3到表14-5,要求将其转换为适合于HBase存储的表并插入数据:

14-3 学生表(Student

学号(S_No

姓名(S_Name

性别(S_Sex

年龄(S_Age

2015001

Zhangsan

male

23

2015002

Mary

female

22

2015003

Lisi

male

24

 

14-4 课程表(Course

课程号(C_No

课程名(C_Name

学分(C_Credit

123001

Math

2.0

123002

Computer Science

5.0

123003

English

3.0

 

14-5 选课表(SC

学号(SC_Sno

课程号(SC_Cno

成绩(SC_Score

2015001

123001

86

2015001

123003

69

2015002

123002

77

2015002

123003

99

2015003

123001

98

2015003

123002

95

 

2. 请编程实现以下功能:

1createTable(String tableName, String[] fields)

创建表,参数tableName为表的名称,字符串数组fields为存储记录各个字段名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。

2addRecord(String tableName, String row, String[] fields, String[] values)

向表tableName、行row(用S_Name表示)和字符串数组fields指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”“Computer Science”“English”三列添加成绩时,字符串数组fields{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values存储这三门课的成绩。

3scanColumn(String tableName, String column)

浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。要求当参数column为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。

4modifyData(String tableName, String row, String column)

修改表tableName,行row(可以用学生姓名S_Name表示),列column指定的单元格的数据。

5deleteRow(String tableName, String row)

删除表tableNamerow指定的行的记录。

 

4.实验报告

题目:

熟悉常用的HBase操作

姓名

粘艺凡

日期

2023.11.14

实验环境:1操作系统:centos7(建议Ubuntu16.04Ubuntu18.04);

2Hadoop版本:3.1.3

3HBase版本:2.2.2

4JDK版本:1.8

5Java IDEIDEA

 

实验内容与完成情况:

list

 

 

在终端打印出指定的表的所有记录数据

 

 

增删、查、统计

 

 

建表、插入数据

 

 

 

 

 

1createTable(String tableName, String[] fields)

创建表,参数tableName为表的名称,字符串数组fields为存储记录各个字段名称的数组。要求当HBase已经存在名为tableName的表的时候,先删除原有的表,然后再创建新的表。

 

 

 

 

 

2addRecord(String tableName, String row, String[] fields, String[] values)

向表tableName、行row(用S_Name表示)和字符串数组fields指定的单元格中添加对应的数据values。其中,fields中每个元素如果对应的列族下还有相应的列限定符的话,用“columnFamily:column”表示。例如,同时向“Math”“Computer Science”“English”三列添加成绩时,字符串数组fields{“Score:Math”, ”Score:Computer Science”, ”Score:English”},数组values存储这三门课的成绩。

 

3scanColumn(String tableName, String column)

浏览表tableName某一列的数据,如果某一行记录中该列数据不存在,则返回null。要求当参数column为某一列族名称时,如果底下有若干个列限定符,则要列出每个列限定符代表的列的数据;当参数column为某一列具体名称(例如“Score:Math”)时,只需要列出该列的数据。

 

4modifyData(String tableName, String row, String column)

修改表tableName,行row(可以用学生姓名S_Name表示),列column指定的单元格的数据。

 

5deleteRow(String tableName, String row)

删除表tableNamerow指定的行的记录。

 

 

 

出现的问题:遇到的最大的问题就是hbase shell无法正常启动。

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

因为很早就写了,忘记了是什么问题,总之困了很久。关闭防火墙啥的都不行,最后好像是恢复快照解决。

 

 

实验4

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

 

1.实验目的

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

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

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

2.实验平台

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

2Hadoop版本:3.1.3

3MySQL版本:5.6;

4HBase版本:2.2.2

5Redis版本5.0.5

6MongoDB版本4.0.16

7JDK版本:1.8

8Java IDEEclipse;

3.实验步骤

(一) MySQL数据库操作

学生表如14-7所示。

14-7 学生表Student

Name

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

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

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

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

3查询zhangsanComputer成绩

4修改lisiMath成绩改为95。

        

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

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

scofield

45

89

100

 

2获取scofieldEnglish成绩信息

 

(二)HBase数据库操作

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

14-8 学生表Student

     name

score

English

Math

Computer

zhangsan

69

86

77

lisi

55

100

88

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

1Hbase Shell命令创建学生Student

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

3)查询zhangsan的Computer成绩

4)修改lisi的Math成绩,95。

 

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

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

scofield

45

89

100

 

2获取scofieldEnglish成绩信息

 

(三)Redis数据库操作

Student键值对如下:

zhangsan:

English: 69

Math: 86

Computer: 77

lisi:

English: 55

Math: 100

Computer: 88

 

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

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

2hgetall命令分别输出zhangsanlisi的成绩信息

3hget命令查询zhangsan的Computer成绩

4)修改lisi的Math成绩,95

 

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

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

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

scofield:

English: 45

Math: 89

Computer: 100

 

2获取scofieldEnglish成绩信息

 

(四)MongoDB数据库操作

Student文档如下:

{

“name”: “zhangsan”,

“score”: {

“English”: 69,

“Math”: 86,

“Computer”: 77

}

}

{

“name”: “lisi”,

“score”: {

“English”: 55,

“Math”: 100,

“Computer”: 88

}

}

 

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

1MongoDB Shell设计出student集合

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

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

4)修改lisi的Math成绩,95

 

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

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

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

{

“name”: “scofield”,

“score”: {

“English”: 45,

“Math”: 89,

“Computer”: 100

}

}

   

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

 

4.实验报告

题目:

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

姓名

粘艺凡

日期

2023.12.5

实验环境:1操作系统:centos7(建议Ubuntu16.04Ubuntu18.04);

2Hadoop版本:3.1.3

3MySQL版本8.0

4HBase版本:2.5.5

5Redis版本7.2.3

6MongoDB版本5.0.11

7JDK版本:1.8

8Java IDEIDEA

实验内容与完成情况:

(1)在MySQL中创建Student表,并录入数据;

 

 

(2)SQL语句输出Student表中的所有记录;

 

(3)查询zhangsanComputer成绩

 

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

 

 

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

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

scofield

45

89

100

 

 

(2)获取scofieldEnglish成绩信息

 

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

 

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

 

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

 

(3)查询zhangsan的Computer成绩

 

4)修改lisi的Math成绩,95。

 

 

 

 

添加数据:English:45  Math:89 Computer:100

scofield

45

89

100

 

获取scofieldEnglish成绩信息

 

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

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

 

(2)hgetall命令分别输出zhangsanlisi的成绩信息

 

(3)hget命令查询zhangsan的Computer成绩

 

4)修改lisi的Math成绩,95

 

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

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

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

scofield:

English: 45

Math: 89

Computer: 100

 

(3)获取scofieldEnglish成绩信息

 

 

(四)MongoDB数据库操作

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

1MongoDB Shell设计出student集合

 

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

 

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

4)修改lisi的Math成绩,95

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

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

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

{

“name”: “scofield”,

“score”: {

“English”: 45,

“Math”: 89,

“Computer”: 100

}

}

   

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

 

 

 

出现的问题:出现了重复创建表的问题

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):把之前的表删掉之后解决问题

 

 

实验5

MapReduce初级编程实践

 

1.实验目的

1通过实验掌握基本的MapReduce编程方法;

2掌握用MapReduce解决一些常见的数据处理问题,包括数据去重、数据排序和数据挖掘等。

2.实验平台

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

2Hadoop版本:3.1.3

3.实验步骤

(一)编程实现文件合并和去重操作

对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。

输入文件A的样例如下:

 

20170101     x

20170102     y

20170103     x

20170104     y

20170105     z

20170106     x

 

输入文件B的样例如下:

20170101      y

20170102      y

20170103      x

20170104      z

20170105      y

 

根据输入文件AB合并得到的输出文件C的样例如下:

20170101      x

20170101      y

20170102      y

20170103      x

20170104      y

20170104      z

20170105      y

20170105      z

20170106      x

 

(二)编写程序实现对输入文件的排序

现在有多个输入文件,每个文件中的每行内容均为一个整数。要求读取所有文件中的整数,进行升序排序后,输出到一个新的文件中,输出的数据格式为每行两个整数,第一个数字为第二个整数的排序位次,第二个整数为原待排列的整数。下面是输入文件和输出文件的一个样例供参考。

输入文件1的样例如下:

33

37

12

40

 

输入文件2的样例如下:

4

16

39

5

 

输入文件3的样例如下:

1

45

25

 

根据输入文件123得到的输出文件如下:

1 1

2 4

3 5

4 12

5 16

6 25

7 33

8 37

9 39

10 40

11 45

 

 

(三)对给定的表格进行信息挖掘

下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。

输入文件内容如下:

child          parent

Steven        Lucy

Steven        Jack

Jone         Lucy

Jone         Jack

Lucy         Mary

Lucy         Frank

Jack         Alice

Jack         Jesse

David       Alice

David       Jesse

Philip       David

Philip       Alma

Mark       David

Mark       Alma

 

输出文件内容如下:

grandchild       grandparent

Steven          Alice

Steven          Jesse

Jone            Alice

Jone            Jesse

Steven          Mary

Steven          Frank

Jone            Mary

Jone            Frank

Philip           Alice

Philip           Jesse

Mark           Alice

Mark           Jesse

 

4.实验报告

题目:

MapReduce初级编程实践

 

姓名

粘艺凡

日期

2023.12.10

实验环境:1操作系统:centos

2Hadoop版本:3.3.4

 

实验内容与完成情况:

(一)编程实现文件合并和去重操作

 

 

(二)编写程序实现对输入文件的排序

 

 

(三)对给定的表格进行信息挖掘

 

 

 

出现的问题:弄了很久发现拒绝连接

 

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

最后把localhost换成了ip192.168.88.101解决了

另外在配置文件中也进行了修改

 

 

实验6

熟悉Hive的基本操作

 

1.实验目的

1)理解Hive作为数据仓库在Hadoop体系结构中的角色。

2)熟练使用常用的HiveQL

2.实验平台

操作系统:Ubuntu18.04(或Ubuntu16.04)。

Hadoop版本:3.1.3

Hive版本:3.1.2

JDK版本:1.8。

3.数据集

由《Hive编程指南》(O'Reilly系列,人民邮电出版社)提供,下载地址:

https://raw.githubusercontent.com/oreillymedia/programming_hive/master/prog-hive-1st-ed-data.zip

备用下载地址:

https://www.cocobolo.top/FileServer/prog-hive-1st-ed-data.zip

解压后可以得到本实验所需的stocks.csvdividends.csv两个文件。

4.实验步骤

1)创建一个内部表stocks,字段分隔符为英文逗号,表结构如表14-11所示。

14-11 stocks表结构

col_name

data_type

exchange            

string              

symbol              

string              

ymd                 

string              

price_open          

float               

price_high          

float               

price_low           

float               

price_close         

float               

volume              

int                 

price_adj_close     

float  

 

(2)创建一个外部分区表dividends(分区字段为exchangesymbol),字段分隔符为英文逗号,表结构如表14-12所示。

14-12 dividends表结构

col_name

data_type

ymd                 

string              

dividend            

float               

exchange            

string              

symbol              

string              

 

3)从stocks.csv文件向stocks表中导入数据。

 

4创建一个未分区的外部表dividends_unpartitioned,并从dividends.csv向其中导入数据,表结构如表14-13所示。

14-13 dividends_unpartitioned表结构

col_name

data_type

ymd                 

string              

dividend            

float               

exchange            

string              

symbol              

string              

 

5通过对dividends_unpartitioned的查询语句,利用Hive自动分区特性向分区表dividends各个分区中插入对应数据。

 

6)查询IBM公司(symbol=IBM)2000年起所有支付股息的交易日(dividends表中有对应记录)的收盘价(price_close)

 

7)查询苹果公司(symbol=AAPL)200810月每个交易日的涨跌情况,涨显示rise,跌显示fall,不变显示unchange

 

8)查询stocks表中收盘价(price_close)比开盘价(price_open)高得最多的那条记录的交易所(exchange)、股票代码(symbol)、日期(ymd)、收盘价、开盘价及二者差价。

 

9)从stocks表中查询苹果公司(symbol=AAPL)年平均调整后收盘价(price_adj_close) 大于50美元的年份及年平均调整后收盘价。

 

10)查询每年年平均调整后收盘价(price_adj_close)前三名的公司的股票代码及年平均调整后收盘价。

 

5.实验报告

题目:

熟悉Hive的基本操作

姓名

粘艺凡

日期:

2023.12.15

实验环境:操作系统:centos7

Hadoop版本:3.3.4

Hive版本:3.1.3

JDK版本:1.8。

实验内容与完成情况:

创建内部表stocks

 

 

创建一个外部分区表dividends

 

 

stocks.csv文件向stocks表中导入数据

 

(3)创建一个未分区的外部表dividends_unpartitioned,并从dividends.csv向其中导入数据,

 

5通过对dividends_unpartitioned的查询语句,利用Hive自动分区特性向分区表dividends各个分区中插入对应数据。

 

6)查询IBM公司(symbol=IBM)2000年起所有支付股息的交易日(dividends表中有对应记录)的收盘价(price_close)

 

7)查询苹果公司(symbol=AAPL)200810月每个交易日的涨跌情况,涨显示rise,跌显示fall,不变显示unchange

 

8)查询stocks表中收盘价(price_close)比开盘价(price_open)高得最多的那条记录的交易所(exchange)、股票代码(symbol)、日期(ymd)、收盘价、开盘价及二者差价。

 

9)从stocks表中查询苹果公司(symbol=AAPL)年平均调整后收盘价(price_adj_close) 大于50美元的年份及年平均调整后收盘价。

 

查询每年年平均调整后收盘价(price_adj_close)前三名的公司的股票代码及年平均调整后收盘价。

 

 

 

出现的问题:本次实验比较简单,跟着步骤来基本上没有出现错误。

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

 

 

实验7

Spark初级编程实践

 

1.实验目的

1)掌握使用Spark访问本地文件和HDFS文件的方法

2掌握Spark应用程序的编写、编译和运行方法

2.实验平台

1操作系统:Ubuntu18.04(或Ubuntu16.04

2Spark版本:2.4.0

3Hadoop版本:3.1.3

3.实验步骤

1Spark读取文件系统的数据

1)在spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;

2)在spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;

3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。

2编写独立应用程序实现数据去重

对于两个输入文件AB,编写Spark独立应用程序(推荐使用Scala语言),对两个文件进行合并,并剔除其中重复的内容,得到一个新文件C。下面是输入文件和输出文件的一个样例,供参考。

输入文件A的样例如下:

20170101    x

20170102    y

20170103    x

20170104    y

20170105    z

20170106    z

输入文件B的样例如下:

20170101    y

20170102    y

20170103    x

20170104    z

20170105    y

根据输入的文件AB合并得到的输出文件C的样例如下:

20170101    x

20170101    y

20170102    y

20170103    x

20170104    y

20170104    z

20170105    y

20170105    z

20170106    z

3编写独立应用程序实现求平均值问题

每个输入文件表示班级学生某个学科的成绩,每行内容由两个字段组成,第一个是学生名字,第二个是学生的成绩;编写Spark独立应用程序求出所有学生的平均成绩,并输出到一个新文件中。下面是输入文件和输出文件的一个样例,供参考。

Algorithm成绩:

小明 92

小红 87

小新 82

小丽 90

Database成绩:

小明 95

小红 81

小新 89

小丽 85

Python成绩:

小明 82

小红 83

小新 94

小丽 91

平均成绩如下:

(小红,83.67)

(小新,88.33)

(小明,89.67)

(小丽,88.67)

 

 

4.实验报告

题目:

Spark初级编程实践

 

姓名

粘艺凡

日期

2023.12.18

实验环境:1操作系统:centos7

2Spark版本:3.4.0

3Hadoop版本:3.3.4

 

实验内容与完成情况:

(1)spark-shell中读取Linux系统本地文件“/home/hadoop/test.txt”,然后统计出文件的行数;

配置sbt

 

 

 

(2)spark-shell中读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;

 

 

(3)编写独立应用程序(推荐使用Scala语言),读取HDFS系统文件“/user/hadoop/test.txt”(如果该文件不存在,请先创建),然后,统计出文件的行数;通过sbt工具将整个应用程序编译打包成 JAR包,并将生成的JAR包通过 spark-submit 提交到 Spark 中运行命令。

 

 

 

2编写独立应用程序实现数据去重

 

 

 

查看最终的结果

 

编写独立应用程序实现求平均值问题

 

编写Scala文件信息

 

sbt文件

 

打包

 

 

出现的问题: /usr/local/sbt/sbt package出现错误

 

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):

原因是按照网上的代码进行复制,没有查看需要修改的东西,最后发现是填写的版本信息出现错误,修改后重新启动打包正常。

 

 

实验8

Flink初级编程实践

 

1.实验目的

1)通过实验掌握基本的Flink编程方法。

2)掌握用IntelliJ IDEA工具编写Flink程序的方法。

2.实验平台

1Ubuntu18.04(或Ubuntu16.04)。

2IntelliJ IDEA

3Flink1.9.1

3.实验步骤

1)使用IntelliJ IDEA工具开发WordCount程序

Linux系统中安装IntelliJ IDEA,然后使用IntelliJ IDEA工具开发WordCount程序,并打包成JAR文件,提交到Flink中运行。

2)数据流词频统计

使用Linux系统自带的NC程序模拟生成数据流,不断产生单词并发送出去。编写Flink程序对NC程序发来的单词进行实时处理,计算词频,并把词频统计结果输出。要求首先在IntelliJ IDEA中开发和调试程序,然后,再打成JAR包部署到Flink中运行。

 

4.实验报告

题目:

Flink初级编程实践

 

姓名

粘艺凡

日期

2023.12.20

实验环境:1centos7

2IntelliJ IDEA

3Flink1.16.2

 

实验内容与完成情况:

三个Java文件

WordCountData.java用于提供原始数据

 

package WordCount;

import org.apache.flink.api.java.DataSet;

import org.apache.flink.api.java.ExecutionEnvironment;

public class WordCountData {

    public static final String[] WORDS=new String[]{"To be, or not to be,--that is the question:--", "Whether \'tis nobler in the mind to suffer", "The slings and arrows of outrageous fortune", "Or to take arms against a sea of troubles,", "And by opposing end them?--To die,--to sleep,--", "No more; and by a sleep to say we end", "The heartache, and the thousand natural shocks", "That flesh is heir to,--\'tis a consummation", "Devoutly to be wish\'d. To die,--to sleep;--", "To sleep! perchance to dream:--ay, there\'s the rub;", "For in that sleep of death what dreams may come,", "When we have shuffled off this mortal coil,", "Must give us pause: there\'s the respect", "That makes calamity of so long life;", "For who would bear the whips and scorns of time,", "The oppressor\'s wrong, the proud man\'s contumely,", "The pangs of despis\'d love, the law\'s delay,", "The insolence of office, and the spurns", "That patient merit of the unworthy takes,", "When he himself might his quietus make", "With a bare bodkin? who would these fardels bear,", "To grunt and sweat under a weary life,", "But that the dread of something after death,--", "The undiscover\'d country, from whose bourn", "No traveller returns,--puzzles the will,", "And makes us rather bear those ills we have", "Than fly to others that we know not of?", "Thus conscience does make cowards of us all;", "And thus the native hue of resolution", "Is sicklied o\'er with the pale cast of thought;", "And enterprises of great pith and moment,", "With this regard, their currents turn awry,", "And lose the name of action.--Soft you now!", "The fair Ophelia!--Nymph, in thy orisons", "Be all my sins remember\'d."};

    public WordCountData() {

    }

    public static DataSet<String> getDefaultTextLineDataset(ExecutionEnvironment env){

        return env.fromElements(WORDS);

    }

}

WordCountTokenizer.java用于切分句子

 

package WordCount;

import org.apache.flink.api.common.functions.FlatMapFunction;

import org.apache.flink.api.java.tuple.Tuple2;

import org.apache.flink.util.Collector;

public class WordCountTokenizer implements FlatMapFunction<String, Tuple2<String,Integer>>{

    public WordCountTokenizer(){}

    public void flatMap(String value, Collector<Tuple2<String, Integer>> out) throws Exception {

        String[] tokens = value.toLowerCase().split("\\W+");

        int len = tokens.length;

        for(int i = 0; i<len;i++){

            String tmp = tokens[i];

            if(tmp.length()>0){

                out.collect(new Tuple2<String, Integer>(tmp,Integer.valueOf(1)));

            }

        }

    }

}

 

WordCount.java提供主函数

 

jar包传入到flink

 

使用火狐浏览器打开localhost8081

 

 

 

数据流词频统计

 

然后打包成jar文件运行

 

结果

 

 

出现的问题:flink依赖包与flink版本不一致出现错误

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):下载对应的版本依赖包