Hadoop1.x代码求出一百万中最大的100个数

  1 /***********************************************
  2 这一百万数据只是在个人电脑上模拟,实际数据可能达到一亿。本人没有测试过
  3 这一百万数据的文件存储格式如下:
  4 4566
  5 1321634
  6 132132
  7 165446
  8 即:一行有一个数字
  9
 10 下面用MapReduce实现
 11
 12 ***********************************************/
 13
 14 import java.io.IOException;
 15 import java.net.URI;
 16 import java.util.Arrays;
 17
 18 import org.apache.hadoop.conf.Configuration;
 19 import org.apache.hadoop.fs.FileSystem;
 20 import org.apache.hadoop.fs.Path;
 21 import org.apache.hadoop.io.LongWritable;
 22 import org.apache.hadoop.io.NullWritable;
 23 import org.apache.hadoop.io.Text;
 24 import org.apache.hadoop.mapreduce.Job;
 25 import org.apache.hadoop.mapreduce.Mapper;
 26 import org.apache.hadoop.mapreduce.Reducer;
 27 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 28 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
 29
 30 /**
 31  * 作业:求最大的100个值
 32  *
 33  */
 34 public class Top100App {
 35
 36     static final String INPUT = "hdfs://192.168.56.100:9000/input";
 37     static final String OUT = "hdfs://192.168.56.100:9000/out";
 38
 39     static final Path INPUT_PATH = new Path(INPUT);
 40     static final Path OUT_PATH = new Path(OUT);
 41
 42     static final int topNum = 100;
 43
 44     public static void main(String[] args) throws Exception{
 45
 46         Configuration conf = new Configuration();
 47         FileSystem fileSystem = FileSystem.get(new URI(OUT),conf);
 48         if(fileSystem.exists(OUT_PATH)){
 49             fileSystem.delete(OUT_PATH,true);
 50         }
 51
 52         Job job = new Job(conf,Top100App.class.getSimpleName());
 53         FileInputFormat.setInputPaths(job, INPUT_PATH);
 54         job.setMapperClass(MyMapper.class);
 55         job.setReducerClass(MyReducer.class);
 56         job.setOutputKeyClass(LongWritable.class);
 57         job.setOutputValueClass(NullWritable.class);
 58         FileOutputFormat.setOutputPath(job, OUT_PATH);
 59         job.waitForCompletion(true);
 60     }
 61
 62     static class MyMapper extends Mapper<LongWritable, Text, LongWritable, NullWritable>{
 63         @Override
 64         protected void map(
 65                 LongWritable key,
 66                 Text value,
 67                 Mapper<LongWritable, Text, LongWritable, NullWritable>.Context context)
 68                 throws IOException, InterruptedException {
 69             context.write(new LongWritable(Long.parseLong(value.toString())), NullWritable.get());
 70         }
 71     }
 72
 73     static class MyReducer extends Reducer<LongWritable, NullWritable, LongWritable, NullWritable>{
 74         long[] topArray = new long[topNum];
 75         int count = 0;
 76         @Override
 77         protected void reduce(
 78                 LongWritable k2,
 79                 Iterable<NullWritable> v2s,
 80                 Reducer<LongWritable, NullWritable, LongWritable, NullWritable>.Context context)
 81                 throws IOException, InterruptedException {
 82             long num = Long.parseLong(k2.toString());
 83             if(count < topNum){
 84                 topArray[count] = num;
 85                 count++;
 86             }else{
 87                 Arrays.sort(topArray);
 88                 if(num > topArray[0]){
 89                     topArray[0] = num;
 90                 }
 91             }
 92         }
 93         @Override
 94         protected void cleanup(
 95                 Reducer<LongWritable, NullWritable, LongWritable, NullWritable>.Context context)
 96                 throws IOException, InterruptedException {
 97             Arrays.sort(topArray);
 98             for(int i = topArray.length -1 ; i > -1 ; i--){
 99                 context.write(new LongWritable(topArray[i]), NullWritable.get());
100             }
101         }
102     }
103
104
105 }
时间: 2024-10-17 03:26:51

Hadoop1.x代码求出一百万中最大的100个数的相关文章

c编程:求出4&#215;4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。

//求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和 #include <stdio.h> int main() { int sum=0; int max,min; int max1,max2;//记录最大值的坐标 int min1,min2;//记录最小值的坐标 int i,j; int a[4][4]; //为数组赋值 for(i=0;i<4;i++) { for(j=0;j<4;j++) { scanf("%d",&

剑指Offer(Java版)第四十题:在数组中的两个数字,如果前面一个数字大于后面的数字, 则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。 并将P对1000000007取模的结果输出。 即输出P%1000000007

/*在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%1000000007 */ import java.util.*; public class Class40 { public int InversePairs(int[] array){ int length = array.length; int P = 0; for(int i = 0; i < lengt

在1-10000中随机生成100个数

题意:在1-10000中随机生成100个数,1-10000已经放在数组中,要求时间和空间都要O(1). 思路:因为空间要O(1),所以我们可以想到这一定是在原本数组的基础上操作,时间也要O(1)的话,证明我们无法Hash后再判重.所以我们可以这么想用一个指针表示目前已经生成好的随机数,那么这个指针从1开始,每次都从剩下的数中随机取一个和当前指针交换就可以完成了,自己写了代码,有错求指出来. import java.util.ArrayList; import java.util.HashSet;

求出整形数组中第二大的数的值

1 int findsecond(int a[], int size) 2 { 3 int max = a[0]; 4 int second = a[1]; 5 int index = 0; 6 for (int i = 0; i < size; ++i) 7 { 8 if (max < a[i]) 9 { 10 second = max; 11 index = i; 12 max = a[i]; 13 } 14 else if (max > a[i]) 15 { 16 if (seco

使用Java语言实现,自动生成10个整数(1~100,求出生成数列中的最大值和最小值,不允许使用Arrays类的sort方法

这是考察基本的java基础,没啥难点,直接上代码,最近在准备面试,所以做一些基础的面试题练练手 public class Demo1 { public static void main(String[] args) { List<Integer> list = new ArrayList<Integer>(); for(int i=0;i<100;i++){ int num = (int) (Math.random()*100)+1; if(!list.contains(nu

4行代码求出圆周率800位,供赏析

[email protected]:~/lab$ cat main.c  #include "stdio.h" int main(){ long a=10000,b,c=2800,d,e,f[2801],g; for(;b-c;) f[b++]=a/5; for(; d=0,g=c*2; c-=14,printf("%.4ld",e+d/a),e=d%a) for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); } [email

编写一个程序,求出整数数组中最小元素的下标。如果这样的元素个数大于1,则返回下标最小的数的下标。

int[] num = new int[]{5,6,1,4,3,6,7,8,92,6};  int min = num[0];  int n = 0;  for (int i = 0; i < num.length; i++) {   if(num[i]<min){    min = num[i];    n = i;   }     }  System.out.println("最小數的下标为:" + n);

关于两数组,求出两数组中相同的的对象

1:平常的操作 (直接同for循环) let a = [{ id: '1', name: '1' }, { id: '2', name: '2' }, { id: '3', name: '2' }] let b = [{ id: '3', name: '3' }, { id: '1', name: '1' } ] let c = [] //定义一个接受相同数组的数组 let num = 0 for (let item of a) { num++ for (let items of b) { nu

找出排序数组中重复数字的个数

开始我的思路是先二分查找找到一个,然后再两边分别看个数. 但是这种方法会退化到O(n).效率不好. 所以更好的方法是,先找出第一个,再找出最后一个.这个在二分查找的时候,通过判断条件的处理,是能够获得的. 比较基本的思路是,如果找到的数=k,那么判断前面一个数是不是k,如果不是,停止查找,这个是第一个:如果是的,那么继续在前半部分查找.领悟.