同样是<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(); } } }
相关推荐
- **列族数据库**:如 HBase,基于Hadoop,适用于大规模分布式存储非结构化数据。 2. **数据一致性模型** - **ACID**:原子性、一致性、隔离性和持久性,是关系型数据库遵循的原则。 - **CAP**:一致性、可用性...
给定两个数据库,一个是包含特定类型的记录(例如用户信息),另一个是按日期划分的多个表,每个表包含某一天的所有记录。在这种情况下,可以通过编写SQL查询来关联这两个数据库中的记录,以找出某个类别中的用户...
这个压缩包“CDA_3套练习题.zip”包含了三套CDA考试的练习题目,对于备考CDA的人来说,是一个非常有价值的资源。 在准备CDA考试的过程中,了解和掌握以下几个关键知识点至关重要: 1. **数据类型与数据清洗**:...
2. **分类算法**:介绍了Bayes贝叶斯分类和SVM支持向量机这两种常用且强大的分类方法,用于预测和模型构建。 3. **聚类算法**:讲解了如何通过聚类将数据分组,以便发现数据的内在结构和模式,如K-means和层次聚类...
这份资源可能包含了关于这两个主题的各种资料,包括理论介绍、实践案例、工具应用等内容。 大数据分析是利用各种先进的数据处理技术和算法,对海量、高速、多样化的数据进行深度挖掘,从而提取出有价值的信息和洞察...
聚类和降维是无监督学习中的两个主要问题。聚类算法如K-means、层次聚类和DBSCAN用于数据分组,而主成分分析(PCA)和t-分布随机邻域嵌入(t-SNE)是常用的降维技术。 3. 半监督学习:半监督学习是一种介于监督学习...
以及两个附加特征(2V):Value(价值)和Veracity(真实性)。 - **应用场景**:广泛应用于金融、医疗、电商、社交网络等多个领域。 #### 3. **课程大纲与学习计划** - **课程大纲**:通常包括了课程目标、课程...
计算机视觉和自然语言处理是深度学习非常重要的两个应用方向。在计算机视觉方面,面试官可能会问到图像处理技术的实现,比如使用OpenCV、Pillow等工具进行图像变换、特征提取等。同时,也会关注于模型的设计,如CNN...
Hadoop和Spark等框架提供了分布式计算的能力,可以高效地处理大规模数据。 9. **数据库管理**:SQL(结构化查询语言)是与数据库交互的语言,用于查询、更新和管理数据。掌握SQL对于从数据库中提取所需数据至关重要...
此外,学习使用数据仓库和大数据技术(如Hadoop和Spark)处理大规模数据集。 3. 统计学基础:掌握概率论、假设检验、置信区间、回归分析等统计概念,这些都是数据分析和预测模型的基础。同时,了解描述性统计,如...