`
seandeng888
  • 浏览: 158492 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

MapReduce案例之多表关联

阅读更多

1       多表关联

1.1              多表关联

多表关联和单表关联类似,它也是通过对原始数据进行一定的处理,从其中挖掘出关心的信息。

1.2              应用场景

输入是两个文件,一个代表工厂表,包含工厂名列和地址编号列;另一个代表地址表,包含地址名列和地址编号列。要求从输入数据中找出工厂名和地址名的对应关系,输出"工厂名——地址名"表。

1.3              设计思路

     多表关联和单表关联相似,都类似于数据库中的自然连接。相比单表关联,多表关联的左右表和连接列更加清楚。所以可以采用和单表关联的相同的处理方式,map识别出输入的行属于哪个表之后,对其进行分割,将连接的列值保存在key中,另一列和左右表标识保存在value中,然后输出。reduce拿到连接结果之后,解析value内容,根据标志将左右表内容分开存放,然后求笛卡尔积,最后直接输出。

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 MTjoin {

    public static int time = 0;

    /*

     * map中先区分输入行属于左表还是右表,然后对两列值进行分割,

     * 保存连接列在key值,剩余列和左右表标志在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 line = value.toString();// 每行文件

            String relationtype = new String();// 左右表标识

            // 输入文件首行,不处理

            if (line.contains("factoryname") == true

                    || line.contains("addressed") == true) {

                return;

            }

            // 输入的一行预处理文本

            StringTokenizer itr = new StringTokenizer(line);

            String mapkey = new String();

            String mapvalue = new String();

            int i = 0;

            while (itr.hasMoreTokens()) {

                // 先读取一个单词

                String token = itr.nextToken();

                // 判断该地址ID就把存到"values[0]"

                if (token.charAt(0) >= '0' && token.charAt(0) <= '9') {

                    mapkey = token;

                    if (i > 0) {

                        relationtype = "1";

                    } else {

                        relationtype = "2";

                    }

                    continue;

                }

                // 存工厂名

                mapvalue += token + " ";

                i++;

            }

            // 输出左右表

            context.write(new Text(mapkey), new Text(relationtype + "+"+ mapvalue));

        }

    }

    /*

     * reduce解析map输出,将value中数据按照左右表分别保存,

  * 然后求出笛卡尔积,并输出。

     */

    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("factoryname"), new Text("addressname"));

                time++;

            }

            int factorynum = 0;

            String[] factory = new String[10];

            int addressnum = 0;

            String[] address = 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);

                // 左表

                if ('1' == relationtype) {

                    factory[factorynum] = record.substring(i);

                    factorynum++;

                }

                // 右表

                if ('2' == relationtype) {

                    address[addressnum] = record.substring(i);

                    addressnum++;

                }

            }

            // 求笛卡尔积

            if (0 != factorynum && 0 != addressnum) {

                for (int m = 0; m < factorynum; m++) {

                    for (int n = 0; n < addressnum; n++) {

                        // 输出结果

                        context.write(new Text(factory[m]),

                                new Text(address[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[] { "MTjoin_in", "MTjoin_out" };

        String[] otherArgs = new GenericOptionsParser(conf, ioArgs).getRemainingArgs();

        if (otherArgs.length != 2) {

            System.err.println("Usage: Multiple Table Join <in> <out>");

            System.exit(2);

        }

        Job job = new Job(conf, "Multiple Table Join");

        job.setJarByClass(MTjoin.class);

        // 设置MapReduce处理类

        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综合案例(4个)

    在这个案例中,MapReduce被用于分析社交网络用户的行为和互动,以便计算每个用户的影响力分数。Map阶段,数据会被拆分成用户之间的交互事件,如点赞、评论、分享等。然后,这些事件被转化为键值对,键可能是用户ID...

    mapreduce案例数据

    在这个案例中,我们关注的是与MapReduce相关的数据文件,包括`dept.csv`, `emp.csv`, 和 `sales.csv`。这些CSV(逗号分隔值)文件通常包含结构化的表格数据,非常适合用MapReduce进行分析和处理。 首先,`dept.csv`...

    21_尚硅谷大数据之MapReduce扩展案例1

    在本节中,我们将深入探讨MapReduce的扩展案例,特别是倒排索引的构建,这是一个在大数据处理中常见的任务,特别是在搜索引擎技术中。倒排索引允许快速定位文档中特定关键词的位置,从而提高搜索效率。 首先,我们...

    MapReduce操作实例-倒排索引.pdf

    这有助于减少Reducer接收到的数据量,因为每个单词只需要一个总计值,而不是多个单次出现的记录。 最后,`Reducer`类`InvertedIndexReducer`负责最终的聚合操作。它接收来自所有Mapper和Combiner的键值对,对相同键...

    Hadoop MapReduce实战手册(完整版)

    对于实际应用,书中可能提供了案例研究,如日志分析、网页排名(PageRank)计算、关联规则挖掘等,这些示例有助于读者更好地理解MapReduce在不同场景下的应用。此外,还可能涉及错误处理、容错机制,以及如何监控和...

    【MapReduce篇01】MapReduce之入门概述1

    `reduce()`方法对每个唯一的键调用一次,处理与该键关联的所有值。 Driver阶段是MapReduce程序的入口,它相当于YARN集群的客户端,负责编译、打包和提交整个程序到集群上运行。Driver会配置JobConf对象,设置Mapper...

    Mapreduce编程模型

    #### 四、MapReduce的应用案例 以单词计数为例,假设我们需要统计多个文档中每个单词出现的次数: - **Map函数**:遍历每个文档的每一行内容,将每一个单词作为键,值设置为“1”。 - **Reduce函数**:对于每个...

    Data-Intensive Text Processing with MapReduce

    《数据密集型文本处理与MapReduce》这本书深入浅出地介绍了MapReduce的基础知识及其在文本处理中的应用,为读者提供了一个全面了解MapReduce技术和实践案例的机会。无论是对于从事大数据处理的研究人员还是工程师来...

    Hadoop MapReduce Cookbook

    - **关联规则挖掘**:通过MapReduce分析数据中的频繁项集,发现商品之间的关联性。 - **在线营销与推荐系统**:基于用户行为数据,使用MapReduce构建推荐模型,提高营销效率。 #### 四、Hadoop MapReduce的实际应用...

    google 论文 mapreduce 中文版

    总之,MapReduce不仅是一种革命性的数据处理模型,也是推动大数据时代发展的关键技术之一。通过其强大的并行处理能力和易于使用的编程接口,MapReduce为开发人员提供了处理海量数据的有效手段。

    基于Apriori算法的频繁项集Hadoop mapreduce.rar

    Apriori算法是一种在数据库中寻找频繁项集的关联规则学习算法,而Hadoop MapReduce则是一个分布式计算框架,常用于处理海量数据。 首先,我们需要理解Apriori算法的基本原理。Apriori算法是由R. Agrawal和R. ...

    大数据技术 Hadoop开发者第二期 MapReduce HDFS Hive Mahout HBase 共64页.pdf

    - 实现多表关联的技术细节。 - **优势**:提高数据处理效率,简化复杂数据关联操作。 #### 七、InputSplit 文件格式分析 - **概念解释**:InputSplit 是 Hadoop 中用于分割输入数据的关键组件。 - **技术细节**:...

    基于hadoop的电商销售预测分析系统HDFS+MapReduce+springboot报告文档

    3) 数据分析:通过MapReduce实现复杂的数据运算和挖掘,如关联规则、聚类、分类等。 4) 预测模型:建立销售预测模型,如时间序列分析、机器学习算法等。 5) 报表生成:自动生成图表和报表,直观展示销售情况和预测...

    Hadoop mapreduce. 基于ItemCF的协同过滤 物品推荐系统.zip

    系统通过计算物品之间的关联度,预测用户可能对未曾接触过的物品产生兴趣,从而实现个性化推荐。 【项目实施】:在“RecommendByItemcf-master”这个项目中,开发者首先需要计算物品之间的相似度矩阵。这通常涉及对...

    行业分类-设备装置-用于在MAPREDUCE环境中处理机器学习算法的系统和方法.zip

    在“用于在MAPREDUCE环境中处理机器学习算法的系统和方法.pdf”这个文档中,很可能会详细讨论上述问题,并给出具体的解决方案、案例分析,以及如何在实际项目中实施这些技术。文档可能会涵盖理论基础、系统架构、...

    关联规则数据挖掘.doc

    在沃尔玛的案例中,数据挖掘揭示了尿布和啤酒的购买行为之间的关联,帮助超市优化商品布局,提升销售额。 关联规则的挖掘过程包括几个关键步骤: 1. 数据预处理:清洗、转换和整合原始数据,确保数据质量。 2. 项集...

    Hadoop实战-陆嘉恒

    第4-7章深入地讲解了mapreduce计算模型、mapreduce应用的开发方法、mapreduce的工作机制,同时还列出了多个mapreduce的应用案例,涉及单词计数、数据去重、排序、单表关联和多表关联等内容;第8-11章全面地阐述了...

    《Hadoop实战》试读本(作者:陆嘉恒)

    第4-7章深入地讲解了MapReduce计算模型、MapReduce应用的开发方法、MapReduce的工作机制,同时还列出了多个MapReduce的应用案例,涉及单词计数、数据去重、排序、单表关联和多表关联等内容;第8-11章全面地阐述了...

    大数据实战案例.zip

    这个案例可能涵盖了大数据的多个核心组件和技术,如Hadoop、Spark、Hive、HBase等。 1. Hadoop:Hadoop是Apache软件基金会的一个开源框架,用于存储和处理大规模数据。它的核心由两个主要部分组成:HDFS(Hadoop...

    hive操作实战

    在实际应用中,经常需要对多个表进行关联查询,以获取更丰富的信息。本案例将演示如何进行不同的表关联查询。 **内连接(`INNER JOIN`)** ``` SELECT stu.name, stu.id, course.courseName FROM stu JOIN ...

Global site tag (gtag.js) - Google Analytics