1 单表关联
1.1 单表关联
"单表关联"这个实例要求从给出的数据中寻找所关心的数据,它是对原始数据所包含信息的挖掘。
1.2 应用场景
实例中给出child-parent(孩子——父母)表,要求输出grandchild-grandparent(孙子——爷奶)表。
1.3 设计思路
分析这个实例,显然需要进行单表连接,连接的是左表的parent列和右表的child列,且左表和右表是同一个表。
连接结果中除去连接的两列就是所需要的结果——"grandchild--grandparent"表。要用MapReduce解决这个实例,首先应该考虑如何实现表的自连接;其次就是连接列的设置;最后是结果的整理。
考虑到MapReduce的shuffle过程会将相同的key会连接在一起,所以可以将map结果的key设置成待连接的列,然后列中相同的值就自然会连接在一起了。
要连接的是左表的parent列和右表的child列,且左表和右表是同一个表,所以在map阶段将读入数据分割成child和parent之后,会将parent设置成key,child设置成value进行输出,并作为左表;再将同一对child和parent中的child设置成key,parent设置成value进行输出,作为右表。为了区分输出中的左右表,需要在输出的value中再加上左右表的信息,比如在value的String最开始处加上字符1表示左表,加上字符2表示右表。这样在map的结果中就形成了左表和右表,然后在shuffle过程中完成连接。reduce接收到连接的结果,其中每个key的value-list就包含了"grandchild--grandparent"关系。取出每个key的value-list进行解析,将左表中的child放入一个数组,右表中的parent放入一个数组,然后对两个数组求笛卡尔积就是最后的结果了。
1.4 程序代码
程序代码如下所示。
import java.io.IOException; import java.util.*; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.Mapper; import org.apache.hadoop.mapreduce.Reducer; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; import org.apache.hadoop.util.GenericOptionsParser; public class STjoin { public static int time = 0; /* * map将输出分割child和parent,然后反序输出一次作为左表, * 正序输出一次作为右表,需要注意的是在输出的value中必须 * 加上左右表的区别标识。 */ public static class Map extends Mapper<Object, Text, Text, Text> { // 实现map函数 public void map(Object key, Text value, Context context) throws IOException, InterruptedException { String childname = new String();// 孩子名称 String parentname = new String();// 父母名称 String relationtype = new String();// 左右表标识 // 输入的一行预处理文本 StringTokenizer itr=new StringTokenizer(value.toString()); String[] values=new String[2]; int i=0; while(itr.hasMoreTokens()){ values[i]=itr.nextToken(); i++; } if (values[0].compareTo("child") != 0) { childname = values[0]; parentname = values[1]; // 输出左表 relationtype = "1"; context.write(new Text(values[1]), new Text(relationtype + "+"+ childname + "+" + parentname)); // 输出右表 relationtype = "2"; context.write(new Text(values[0]), new Text(relationtype + "+"+ childname + "+" + parentname)); } } } public static class Reduce extends Reducer<Text, Text, Text, Text> { // 实现reduce函数 public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { // 输出表头 if (0 == time) { context.write(new Text("grandchild"), new Text("grandparent")); time++; } int grandchildnum = 0; String[] grandchild = new String[10]; int grandparentnum = 0; String[] grandparent = new String[10]; Iterator ite = values.iterator(); while (ite.hasNext()) { String record = ite.next().toString(); int len = record.length(); int i = 2; if (0 == len) { continue; } // 取得左右表标识 char relationtype = record.charAt(0); // 定义孩子和父母变量 String childname = new String(); String parentname = new String(); // 获取value-list中value的child while (record.charAt(i) != '+') { childname += record.charAt(i); i++; } i = i + 1; // 获取value-list中value的parent while (i < len) { parentname += record.charAt(i); i++; } // 左表,取出child放入grandchildren if ('1' == relationtype) { grandchild[grandchildnum] = childname; grandchildnum++; } // 右表,取出parent放入grandparent if ('2' == relationtype) { grandparent[grandparentnum] = parentname; grandparentnum++; } } // grandchild和grandparent数组求笛卡尔儿积 if (0 != grandchildnum && 0 != grandparentnum) { for (int m = 0; m < grandchildnum; m++) { for (int n = 0; n < grandparentnum; n++) { // 输出结果 context.write(new Text(grandchild[m]), new Text(grandparent[n])); } } } } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); conf.set("mapred.job.tracker", "192.168.1.2:9001"); String[] ioArgs = new String[] { "STjoin_in", "STjoin_out" }; String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs(); if (otherArgs.length != 2) { System.err.println("Usage: Single Table Join <in> <out>"); System.exit(2); } Job job = new Job(conf, "Single Table Join"); job.setJarByClass(STjoin.class); // 设置Map和Reduce处理类 job.setMapperClass(Map.class); job.setReducerClass(Reduce.class); // 设置输出类型 job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); // 设置输入和输出目录 FileInputFormat.addInputPath(job, new Path(otherArgs[0])); FileOutputFormat.setOutputPath(job, new Path(otherArgs[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } |
相关推荐
在这个案例中,MapReduce被用于分析社交网络用户的行为和互动,以便计算每个用户的影响力分数。Map阶段,数据会被拆分成用户之间的交互事件,如点赞、评论、分享等。然后,这些事件被转化为键值对,键可能是用户ID...
在这个案例中,我们关注的是与MapReduce相关的数据文件,包括`dept.csv`, `emp.csv`, 和 `sales.csv`。这些CSV(逗号分隔值)文件通常包含结构化的表格数据,非常适合用MapReduce进行分析和处理。 首先,`dept.csv`...
在本节中,我们将深入探讨MapReduce的扩展案例,特别是倒排索引的构建,这是一个在大数据处理中常见的任务,特别是在搜索引擎技术中。倒排索引允许快速定位文档中特定关键词的位置,从而提高搜索效率。 首先,我们...
这有助于减少Reducer接收到的数据量,因为每个单词只需要一个总计值,而不是多个单次出现的记录。 最后,`Reducer`类`InvertedIndexReducer`负责最终的聚合操作。它接收来自所有Mapper和Combiner的键值对,对相同键...
对于实际应用,书中可能提供了案例研究,如日志分析、网页排名(PageRank)计算、关联规则挖掘等,这些示例有助于读者更好地理解MapReduce在不同场景下的应用。此外,还可能涉及错误处理、容错机制,以及如何监控和...
`reduce()`方法对每个唯一的键调用一次,处理与该键关联的所有值。 Driver阶段是MapReduce程序的入口,它相当于YARN集群的客户端,负责编译、打包和提交整个程序到集群上运行。Driver会配置JobConf对象,设置Mapper...
#### 四、MapReduce的应用案例 以单词计数为例,假设我们需要统计多个文档中每个单词出现的次数: - **Map函数**:遍历每个文档的每一行内容,将每一个单词作为键,值设置为“1”。 - **Reduce函数**:对于每个...
《数据密集型文本处理与MapReduce》这本书深入浅出地介绍了MapReduce的基础知识及其在文本处理中的应用,为读者提供了一个全面了解MapReduce技术和实践案例的机会。无论是对于从事大数据处理的研究人员还是工程师来...
系统通过计算物品之间的关联度,预测用户可能对未曾接触过的物品产生兴趣,从而实现个性化推荐。 【项目实施】:在“RecommendByItemcf-master”这个项目中,开发者首先需要计算物品之间的相似度矩阵。这通常涉及对...
- **关联规则挖掘**:通过MapReduce分析数据中的频繁项集,发现商品之间的关联性。 - **在线营销与推荐系统**:基于用户行为数据,使用MapReduce构建推荐模型,提高营销效率。 #### 四、Hadoop MapReduce的实际应用...
总之,MapReduce不仅是一种革命性的数据处理模型,也是推动大数据时代发展的关键技术之一。通过其强大的并行处理能力和易于使用的编程接口,MapReduce为开发人员提供了处理海量数据的有效手段。
Apriori算法是一种在数据库中寻找频繁项集的关联规则学习算法,而Hadoop MapReduce则是一个分布式计算框架,常用于处理海量数据。 首先,我们需要理解Apriori算法的基本原理。Apriori算法是由R. Agrawal和R. ...
#### 六、一对多的表关联在 MapReduce 中的应用 - **应用场景**:介绍在 MapReduce 中处理一对多关系表的方法。 - **技术要点**: - 如何通过键值对的形式表示一对多关系。 - 实现多表关联的技术细节。 - **优势*...
3) 数据分析:通过MapReduce实现复杂的数据运算和挖掘,如关联规则、聚类、分类等。 4) 预测模型:建立销售预测模型,如时间序列分析、机器学习算法等。 5) 报表生成:自动生成图表和报表,直观展示销售情况和预测...
在“用于在MAPREDUCE环境中处理机器学习算法的系统和方法.pdf”这个文档中,很可能会详细讨论上述问题,并给出具体的解决方案、案例分析,以及如何在实际项目中实施这些技术。文档可能会涵盖理论基础、系统架构、...
第4-7章深入地讲解了mapreduce计算模型、mapreduce应用的开发方法、mapreduce的工作机制,同时还列出了多个mapreduce的应用案例,涉及单词计数、数据去重、排序、单表关联和多表关联等内容;第8-11章全面地阐述了...
第4-7章深入地讲解了MapReduce计算模型、MapReduce应用的开发方法、MapReduce的工作机制,同时还列出了多个MapReduce的应用案例,涉及单词计数、数据去重、排序、单表关联和多表关联等内容;第8-11章全面地阐述了...
在沃尔玛的案例中,数据挖掘揭示了尿布和啤酒的购买行为之间的关联,帮助超市优化商品布局,提升销售额。 关联规则的挖掘过程包括几个关键步骤: 1. 数据预处理:清洗、转换和整合原始数据,确保数据质量。 2. 项集...
6. 数据分析与挖掘:实战案例可能会涵盖使用各种算法进行数据挖掘,如关联规则、聚类、分类和回归分析,以发现数据中的模式、趋势和关联。 7. 实时流处理:随着实时数据需求的增长,可能还会涉及到Apache Flink或...
通过以上实战案例,我们不仅了解了如何在Hive中创建表并加载数据,还掌握了不同类型的表关联查询方法。这些技能对于处理大数据集中的复杂关系数据非常重要。在未来的工作中,熟练掌握Hive的操作将会极大地提高数据...