`

[Hadoop] 练习:使用Hadoop计算两个向量的内积

 
阅读更多

同样是<Hadoop in Action> 上面的练习~

 

练习:

计算两个向量的内积,比如:

v1 = [1 2 3]

v2 = [2 3 4]

内积 = 2 + 5 + 12 = 19

 

我的输入文件:

1.0 2.0
3.0 4.0
1 1

即:

v1 = [1 3 1]

v2 = [2 4 1]

结果: 15

 

思路:

每行读取两个向量的两个元素并计算乘积,然后在Reduce之中进行求和。

注意:

如果在main函数之中,设定了setCombiner(Reduce.class) 最后结果会出错,因为和被计算了两次!

即算出来的结果会是30!

 

代码如下:

package hadoop_in_action_exersice;

import java.io.IOException;
import java.util.TreeMap;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.DoubleWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
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;

public class InnerProduct {
	private static final Text SUM = new Text("sum");
	
	public static class Map extends Mapper<LongWritable, Text, Text, DoubleWritable> {
		
		TreeMap<Integer, String> map = new TreeMap<Integer, String>(); 
		
		private static double map_sum = 0.0;
		public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
			
			String line = value.toString();
			String[] arr = line.split(" ");
			try {
				double v1 = Double.parseDouble(arr[0]);
				double v2 = Double.parseDouble(arr[1]);
				map_sum += v1 * v2;
			} catch(Exception e) {
				e.printStackTrace();
			}
		}
		@Override
		protected void cleanup(
				Mapper<LongWritable, Text, Text, DoubleWritable>.Context context)
				throws IOException, InterruptedException {
			System.out.println("!!!" + map_sum);
			context.write(SUM, new DoubleWritable(map_sum));
		}
		
		
	}
	
	
	public static class Reduce extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
		private static double sum = 0;
		
		public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
			
			if(key.toString() .equals(SUM.toString()) ) {
				for(DoubleWritable v : values) {
					sum += v.get();
				}
				context.write(key, new DoubleWritable(sum));
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Configuration conf = new Configuration();
		try {
			Job job = new Job(conf, "my own word count");
			job.setJarByClass(InnerProduct.class);
			job.setMapperClass(Map.class);
			job.setCombinerClass(Reduce.class);
//			job.setReducerClass(Reduce.class); // 这里不能调用,否则会多进行一次求和的操作造成结果错误
			job.setOutputKeyClass(Text.class);
			job.setOutputValueClass(DoubleWritable.class);
			FileInputFormat.setInputPaths(job, new Path("/home/hadoop/DataSet/Hadoop/Exercise/InnerProduct"));
			FileOutputFormat.setOutputPath(job, new Path("/home/hadoop/DataSet/Hadoop/Exercise/InnerProduct-output"));
			System.out.println(job.waitForCompletion(true));
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
	}
}

 

分享到:
评论

相关推荐

    山东大学 nosql期末复习笔记 nosql 期末复习

    - **列族数据库**:如 HBase,基于Hadoop,适用于大规模分布式存储非结构化数据。 2. **数据一致性模型** - **ACID**:原子性、一致性、隔离性和持久性,是关系型数据库遵循的原则。 - **CAP**:一致性、可用性...

    百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题.

    给定两个数据库,一个是包含特定类型的记录(例如用户信息),另一个是按日期划分的多个表,每个表包含某一天的所有记录。在这种情况下,可以通过编写SQL查询来关联这两个数据库中的记录,以找出某个类别中的用户...

    CDA_3套练习题.zip

    这个压缩包“CDA_3套练习题.zip”包含了三套CDA考试的练习题目,对于备考CDA的人来说,是一个非常有价值的资源。 在准备CDA考试的过程中,了解和掌握以下几个关键知识点至关重要: 1. **数据类型与数据清洗**:...

    清华大学精品数据挖掘&amp;机器学习学习PPT课件(31页)含练习题 第5章 综合实战:日志的挖掘与应用.pptx

    2. **分类算法**:介绍了Bayes贝叶斯分类和SVM支持向量机这两种常用且强大的分类方法,用于预测和模型构建。 3. **聚类算法**:讲解了如何通过聚类将数据分组,以便发现数据的内在结构和模式,如K-means和层次聚类...

    大数据分析与数据挖掘 资源

    这份资源可能包含了关于这两个主题的各种资料,包括理论介绍、实践案例、工具应用等内容。 大数据分析是利用各种先进的数据处理技术和算法,对海量、高速、多样化的数据进行深度挖掘,从而提取出有价值的信息和洞察...

    Machine Learning

    聚类和降维是无监督学习中的两个主要问题。聚类算法如K-means、层次聚类和DBSCAN用于数据分组,而主成分分析(PCA)和t-分布随机邻域嵌入(t-SNE)是常用的降维技术。 3. 半监督学习:半监督学习是一种介于监督学习...

    Level IV数据分析专家 38.7G的学习资料 资料全面,包含大纲和学习计划表 百度网盘

    以及两个附加特征(2V):Value(价值)和Veracity(真实性)。 - **应用场景**:广泛应用于金融、医疗、电商、社交网络等多个领域。 #### 3. **课程大纲与学习计划** - **课程大纲**:通常包括了课程目标、课程...

    2021最新大厂AI面试题Q2版121题.pdf

    计算机视觉和自然语言处理是深度学习非常重要的两个应用方向。在计算机视觉方面,面试官可能会问到图像处理技术的实现,比如使用OpenCV、Pillow等工具进行图像变换、特征提取等。同时,也会关注于模型的设计,如CNN...

    data_analytics_bootcamp:家庭作业资料库

    Hadoop和Spark等框架提供了分布式计算的能力,可以高效地处理大规模数据。 9. **数据库管理**:SQL(结构化查询语言)是与数据库交互的语言,用于查询、更新和管理数据。掌握SQL对于从数据库中提取所需数据至关重要...

    数据科学课程

    此外,学习使用数据仓库和大数据技术(如Hadoop和Spark)处理大规模数据集。 3. 统计学基础:掌握概率论、假设检验、置信区间、回归分析等统计概念,这些都是数据分析和预测模型的基础。同时,了解描述性统计,如...

Global site tag (gtag.js) - Google Analytics