林子雨—大数据技术原理与应用—上机实验五

本文介绍如何使用MapReduce实现数据去重、排序及信息挖掘。针对数据去重问题,通过设置相同的Key值并利用Reduce阶段合并数据;对于排序任务,通过Map阶段转化为IntWritable类型并依赖MapReduce的默认排序机制;在信息挖掘方面,采用单表连接的方法揭示父子及祖孙辈关系。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:MapReduce编程初级实践
实验环境:
       操作系统:ubuntu16.04
       hadoop版本:1.2.1(伪分布式)
       JDK版本:1.8
       Eclipse 3.8
解题思路:
1. 编程实现文件合并和去重操作。
图示解题思路
    【注释】数据去重的最终目标是让原始数据中出现次数超过一次的数据在输出文件中只出现一次。由于shuffle过程会有合并相同key值记录的过程,会想到将不同文件中相同内容数据的Key设置成一样的,即是Map处理后是一样的,然后把交给Reduce,无论这个数据的value-list是怎么样,只要在最终结果输出它的key就行了。

2. 编写程序实现对输入文件的排序。
图示解题思路
    【注释】MapRedcue有默认排序规则:按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序。所以在Map中将读入的数据转化成IntWritable型,然后作为key值输出(value任意)。reduce拿到之后,将输入的key作为value输出,并根据value-list中元素的个数决定输出的次数。

3. 对给定的表格进行信息挖掘。
图示解题思路
    【注释】分析题意可知这是要进行单表连接。考虑到MapReduce的Shuffle过程会将相同的Key值放在一起,所以可以将Map结果的Key值设置成待连接的列,然后列中相同的值就自然会连接在一起了。具体而言,就是是左表的parent列和右表的child列设置成Key,则左表中child(即为结果中的grandchild)和右表中的parent(即为结果中的grandparent)。为了区分输出中的左、右表,需要在输出的value-list中再加入左、右表的信息,比如,在value的String最开始处加上字符1表示左表,加上字符2表示右表。这样设计后,Reduce接收的中每个key的value-list包含了grandchild和grandparent关系。取出每个Key的value-list进行解析,将右表中的child放入一个数组,左表中的parent放入另一个数组,然后对两个数组求笛卡尔积就是最后的结果。
实验内容:
1. 编程实现文件合并和去重操作。
       对于两个输入文件,即文件A和文件B,请编写MapReduce程序,对两个文件进行合并,并剔除其中重复的内容,得到一个新的输出文件C。下面是输入文件和输出文件的一个样例供参考。
文件A

文件B

文件C
       关键代码:

Map函数代码

Reduce函数代码

main函数代码

程序输出结果

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

文件二

文件三
输出文件
       关键代码:

Map函数代码

Reduce函数代码

Main函数代码

程序输出结果

3. 对给定的表格进行信息挖掘。
       下面给出一个child-parent的表格,要求挖掘其中的父子辈关系,给出祖孙辈关系的表格。
输入文件

输出文件
       关键代码:

Map函数代码

Reduce函数代码

Reduce函数代码

Main函数代码

程序输出结果

解决方案(列出遇到的问题和解决办法,列出没有解决的问题):
       1.第一个实验“数据去重”在检验代码无错的情况下,输出的结果却把两个文件的所有数据给输出来了,数据重合的数据并没有合并。
       解决方法:经过认真分析程序逻辑和输出结果,发现问题出现在不同文件中一行数据之间的空格不同,由于“数据去重”的合并过程是相同字符串的就合在一起,所以在不同文件中一行数据之间的空格不同的情况下,shuffle会把这两个本应合并的字符串认为是两个字符串,故出现了错误的结果。
       2.出错代码如下:
org.apache.hadoop.mapreduce.ReduceContext$ValueIterator cannot be cast to org.apache.commons.math.util.OpenIntToDoubleHashMap$Iterator。
       解决方法:首先分析到出问题的代码是这两段:Iterator ite=(Iterator) values.iterator();String record=((java.util.Iterator) ite).next().toString();可以看出,第一段代码强制类型转换得到是org.apache.commons.math.util.OpenIntToDoubleHashMap$Iterator而下面要用到的是java.util.Iterator,所以修改第一段代码为java.util.Iterator ite=values.iterator();问题解决。
<think>好的,我现在需要帮助用户比较NoSQL关系型数据库的操作方法,特别是参考林子雨大数据实验四的内容。首先,我得先理解用户的具体需求是什么。用户提到想对比两者的操作方法,可能包括基本的CRUD操作、查询方式、事务处理等方面。另外,用户还提到了林子雨上机实验四,所以需要确保回答符合该实验的内容结构。 接下来,我需要回顾林子雨的相关资料。根据用户提供的引用,引用[1]提到了几种NoSQL数据库类型及其适用场合优缺点,比如键值数据库、列族数据库、文档数据库图数据库。这些信息可以作为对比的基础。例如,键值数据库操作简单,但查询有限,而关系型数据库支持复杂的SQL查询。引用[4]中提到了HBase的一个错误,提示表需要至少一个列族,这可能涉及到列族数据库的操作方法,比如在HBase中创建表时必须定义列族,这关系型数据库建表时的列定义不同。 然后,我需要整理NoSQL关系型数据库在操作上的主要区别。关系型数据库使用SQL,具有严格的模式,支持事务连接操作。而NoSQL根据不同类型有不同的操作方式,比如键值对的存取、文档的JSON查询、列族的列存储等。例如,文档数据库(如MongoDB)使用类似JSON的查询语法,而列族数据库(如HBase)则通过行键列族来访问数据。 还要考虑用户可能的实验环境。引用[2]提到实验四关于HBase的安装运行,引用[3]强调了教师的实践能力,包括大数据实验环境构建。因此,在操作比较中可能需要包括具体的命令行或API示例,比如HBase的shell命令对比MySQL的SQL语句。 用户的问题还提到要参考林子雨的教程,所以可能需要结合实验四的具体步骤,比如如何在不同数据库中创建表、插入数据、查询删除数据。例如,HBase建表时需要指定列族,而MySQL建表时定义列数据类型。此外,事务处理方面,关系型数据库通常支持ACID,而NoSQL如HBase可能只支持行级事务,或者在某些情况下不保证强一致性。 另外,需要指出适用场景,比如当需要灵活的模式水平扩展时选择NoSQL,而需要复杂查询事务支持时使用关系型数据库。这部分可以引用[1]中的优缺点,比如文档数据库适合灵活数据结构,图数据库适合复杂关系。 最后,确保回答结构清晰,分点对比,附上相关示例代码或命令,帮助用户理解操作上的具体差异。同时,生成的相关问题要围绕用户可能感兴趣的扩展内容,比如性能对比、适用场景选择、实验常见错误等。</think>### NoSQL关系型数据库操作方法对比(基于林子雨大数据实验四) #### 一、数据模型差异 1. **关系型数据库(MySQL)** 使用结构化二维表模型,需预先定义字段类型约束 示例: ```sql CREATE TABLE students ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); ``` 2. **NoSQL数据库(HBase)** 采用列族存储模型,支持动态添加列 示例(HBase Shell): ```shell create 'students', 'info', 'scores' # 创建包含两个列族的表[^4] ``` #### 二、CRUD操作对比 | 操作类型 | 关系型数据库(SQL) | NoSQL(HBase) | |----------|---------------------|----------------| | **插入** | `INSERT INTO students VALUES (1, '张三', 20)` | `put 'students','row1','info:name','张三'` | | **查询** | `SELECT * FROM students WHERE age > 18` | `scan 'students', {FILTER => "ValueFilter(>, 'binary:18')"}` | | **更新** | `UPDATE students SET age=21 WHERE id=1` | `put 'students','row1','info:age','21'` | | **删除** | `DELETE FROM students WHERE id=1` | `deleteall 'students','row1'` | #### 三、特性对比 1. **事务支持** - MySQL支持ACID事务 - HBase仅支持行级原子操作[^1] 2. **查询能力** - SQL支持复杂JOIN操作: ```sql SELECT s.name, c.course FROM students s JOIN courses c ON s.id = c.student_id ``` - HBase需通过行键扫描过滤器实现简单查询 3. **扩展方式** - MySQL主要采用垂直扩展 - HBase支持水平扩展(基于HDFS)[^2] #### 四、实验注意事项 1. HBase建表必须指定列族,否则报错`Table should have at least one column family` 2. 大数据实验需确保Hadoop集群正常运行 3. 关系型数据库操作建议使用MySQL Workbench,NoSQL操作使用HBase Shell
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值