namenode示例 数据排序

2.0 数据排序

"数据排序"是许多实际任务执行时要完成的第一项工作,比如学生成绩评比数据建立索引等。这个实例和数据去重类似,都是原始数据进行初步处理,为进一步的数据操作打好基础

2.1 实例描述

对输入文件中数据进行排序。输入文件中的每行内容均为一个数字即一个数据。要求在输出中每行有两个间隔的数字,其中,第一个代表原始数据在原始数据集中的位次第二个代表原始数据

  a.txt

  7

  4

  3

  b.txt

  4

  2

  样例输出:

  1  2

  2  3

  3  4

  4  7

2.2 设计思路

  这个实例仅仅要求对输入数据进行排序,熟悉MapReduce过程的读者会很快想到在MapReduce过程中就有排序,是否可以利用这个默认的排序,而不需要自己再实现具体的排序呢?答案是肯定的。

  但是在使用之前首先需要了解它的默认排序规则。它是按照key值进行排序的,如果key为封装int的IntWritable类型,那么MapReduce按照数字大小对key排序,如果key为封装为String的Text类型,那么MapReduce按照字典顺序对字符串排序。

  了解了这个细节,我们就知道应该使用封装int的IntWritable型数据结构了。也就是在map中将读入的数据转化成 IntWritable型,然后作为key值输出(value任意)。reduce拿到<key,value-list>之后,将输入的 key作为value输出。输出的key(即代码中的linenum)是一个全局变量,它统计当前key的位次。需要注意的是这个程序中没有配置Combiner,也就是在MapReduce过程中不使用Combiner。这主要是因为使用map和reduce就已经能够完成任务了。

2.3 程序代码

程序代码如下所示:

  

package test;

import java.io.IOException;

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

public class Sort{

	public static class Map extends Mapper<Object, Text, IntWritable, NullWritable>{
		private static IntWritable data = new IntWritable();

		protected void map(Object key, Text value, Context context)
				throws java.io.IOException ,InterruptedException {
			//设置数据
			data.set(Integer.parseInt(value.toString()));
			context.write(data, NullWritable.get());
		};
	}
	public static class Reduce extends Reducer<IntWritable, NullWritable, IntWritable, IntWritable>{
		private static IntWritable lineNum = new IntWritable(1);

		protected void reduce(IntWritable key, Iterable<NullWritable> values, Context context)
				throws java.io.IOException ,InterruptedException {
			context.write(lineNum, key);
			lineNum.set(lineNum.get() + 1);
		};
	}

	public static void main(String[] args) throws Exception {
		Configuration conf = new Configuration();
		String[] otherArgs = new GenericOptionsParser(conf,args).getRemainingArgs();
		if(otherArgs.length != 2){
			System.err.println("Usage: Data Sort!");
			System.exit(2);
		}

		Job job = new Job(conf, "Data Sort");
		job.setJarByClass(Sort.class);
		//设置Map和Reduce
		job.setMapperClass(Map.class);
		job.setReducerClass(Reduce.class);
		//设置Map的输入和输出类,默认不是这个,否则提示类型Unmismattch
		job.setMapOutputKeyClass(IntWritable.class);
		job.setMapOutputValueClass(NullWritable.class);
		//设置Reduce端的输入和输出类
		job.setOutputKeyClass(IntWritable.class);
		job.setOutputValueClass(IntWritable.class);
		//设置输入和输出目录
		FileInputFormat.addInputPath(job, new Path(args[0]));
		FileOutputFormat.setOutputPath(job, new Path(args[1]));

		System.exit(job.waitForCompletion(true) ? 0 :1);
	}
}

2.4 准备数据,上传到hdfs的/input目录下

2.5 myeclipse设置程序的参数 /input /output ,运行程序

2.6 输出结果:

  1  2

  2  3

  3  4

  4  7

over

参考 : http://penghuaiyi.iteye.com/blog/1943464

  

namenode示例 数据排序,布布扣,bubuko.com

时间: 2024-12-18 04:58:01

namenode示例 数据排序的相关文章

Berkeley DB使用SecondKey给数据排序的实现方法

Berkeley DB使用SecondKey给数据排序的 实现方法是本文我们主要要介绍的内容,在做项目的时候用到了nosql数据库BDB,借此机会研究了一下它的用法.它的官方示例和文档比较丰富,感觉比较 容易学习.在开发过程中出现了一个需求,要把数据根据插入时间遍历,个人认为通过第二主键(SecondKey)比较容易实现. 以下是我的基本实现过程: 1.在ValueBean中加入insertTime属性 public class ValueBean{ private String insertT

百万数据排序:优化的选择排序(堆排序)

  前一篇给大家介绍了<必知必会的冒泡排序和快速排序(面试必知)>,现在继续介绍排序算法          本博文介绍首先介绍直接选择排序,然后针对直接选择排序的缺点改进的"堆排序",堆排序非常适合:数组规模非常大(数百万或更多) + 严格要求辅助空间的场景.   直接选择排序 (一)概念及实现 直接选择排序的原理:将整个数组视为虚拟的有序区和无序区,重复的遍历数组,每次遍历从无序区中选出一个最小(或最大)的元素,放在有序区的最后,每一次遍历排序过程都是有序区元素个数增加,

已知s.txt文件中有一个这样的字符串 请编写程序读取数据内容,把数据排序后写入 ss.txt文件

package cn.idcast5; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.Arrays; /* * 需求:已知s.txt文件中有一个这样

SQL从入门到基础 - 04 SQLServer基础2(数据删除、数据检索、数据汇总、数据排序、通配符过滤、空值处理、多值匹配)

一.数据删除 1. 删除表中全部数据:Delete from T_Person. 2. Delete 只是删除数据,表还在,和Drop Table(数据和表全部删除)不同. 3. Delete 也可以带where子句来删除一部分数据:Delete from T_Person where FAge>20. 二.数据检索 1. 执行备注中的代码创建测试数据表. 2. 简单的数据检索:select *from T_Employee(*表示所有字段) 3. 只检索需要的列:select FNumber

Dynamics 2015 数据管理 之 如何批量导入数据到 正式区(二)系统自带示例数据 安装及教学

Dynamics 2015系统自带了一些示例数据,大家可以导入后,用于模拟测试,省得大家输入的时间了, 现分享一下导入的方法,很简单的技巧. 进入方式: 在 设置 ---- 数据管理 菜单进入后,第4行,第二个. 可以在导入中看要导入的交易. 好了,是不是方便大家测试了啊,谢谢.

Python学习——数据排序方法

Python对数据排序又两种方法: 1. 原地排序:采用sort()方法,按照指定的顺序排列数据后用排序后的数据替换原来的数据(原来的顺序丢失),如: >>> data1=[4,2,6,432,78,43,22,896,42,677,12] >>> data1.sort() >>> data1 #原来的顺序被替换 [2, 4, 6, 12, 22, 42, 43, 78, 432, 677, 896] 2. 复制排序:采用sorted()内置函数,按照

21、任务十九——可视化数据排序

0.题目 基于任务18 限制输入的数字在10-100 队列元素数量最多限制为60个,当超过60个时,添加元素时alert出提示 队列展现方式变化如图,直接用高度表示数字大小 实现一个简单的排序功能,如冒泡排序(不限制具体算法),用可视化的方法表达出来 1.解答过程 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>task19</title> &

使用独立模式安装Sharepoint Server 2013出现创建示例数据错误的解决方案

使用独立模式安装Sharepoint Server 2013,允许配置向导到第8步创建示例数据时,出错了! Exception: System.ArgumentException: The SDDL string contains an invalid sid or a sid that cannot be translated.Parameter name: sddlForm 解决办法: 1.用本机管理员帐号登录.2.为搜索服务创建一个新账户,如SearchSvc.3.把这个账户添加到本地的W

设计简单的后台管理的数据排序

场景: 前端需要展示一个列表如首页的轮播图后台需要能够控制列表数据的排序. 需求 自动规则 + 运营干预干预包括降低排名提升排名设定位置和新增item 实现 在Web后台管理系统中列表形式的数据排序功能是很常见的需求.要实现这类功能给数据表增加一个排序字段order越大排名越靠前数字相同时按照自动规则如id排序这样就可以实现了 id name order 1 tom 2 2 jack 3 3 bob 1 实际的排序显示为 jack tom bob 既然是后台那么主要的用户是公司的运营人员本着提高