1. 程式人生 > >mapreduce,自定義排序,分割槽,分組實現按照年份升序排序,溫度降序排序

mapreduce,自定義排序,分割槽,分組實現按照年份升序排序,溫度降序排序

自定義類:

package myhadoop;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

import org.apache.hadoop.io.WritableComparable;

public class KeyClass implements WritableComparable<KeyClass>{

	private int year;
	private int hot;
	
	
	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}

	public int getHot() {
		return hot;
	}

	public void setHot(int hot) {
		this.hot = hot;
	}

	@Override
	public void readFields(DataInput in) throws IOException {
		this.year = in.readInt();
		this.hot = in.readInt();
	}

	@Override
	public void write(DataOutput out) throws IOException {
		out.writeInt(year);
		out.writeInt(hot);
	}

	@Override
	public int compareTo(KeyClass o) {
		int result = Integer.compare(this.year, o.getYear());
		if(result!=0){
			return result;
		}
		return Integer.compare(this.hot, o.hot);
	}

	@Override
	public String toString() {
		return year+","+hot;
	}
	
	@Override
	public int hashCode() {
		return Integer.valueOf(year+hot).hashCode();
	}
	
}
自定義排序:
package myhadoop;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;

public class KeySort extends WritableComparator {

	public KeySort() {
		super(KeyClass.class,true);
	}
	
	@Override
	public int compare(WritableComparable a, WritableComparable b) {
		KeyClass key1 = (KeyClass) a;
		KeyClass key2 = (KeyClass) b;
		int result = Integer.compare(key1.getYear(), key2.getYear());
		if(result!=0){
			return result;
		}
		return -Integer.compare(key1.getHot(), key2.getHot());
	}
	
}

自定義分割槽:
package myhadoop;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

public class KeyPart extends Partitioner<KeyClass, Text>{

	@Override
	public int getPartition(KeyClass key, Text value, int num) {
		return (key.getYear()*127)%num;
	}
	
	
}

自定義分組:
package myhadoop;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;

public class KeyGroup extends WritableComparator{
	public KeyGroup() {
		super(KeyClass.class,true);
	}
	
	@Override
	public int compare(WritableComparable a, WritableComparable b) {
		KeyClass key1 = (KeyClass) a;
		KeyClass key2 = (KeyClass) b;
		return  Integer.compare(key1.getYear(), key2.getYear());
	}
}

mapreduce:
package myhadoop;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
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 KeyMapReduce {
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	static class KeyMapper extends Mapper<LongWritable, Text, KeyClass, Text>{

		@Override
		protected void map(LongWritable key, Text value, Context context)
				throws IOException, InterruptedException {
			String line = value.toString();
			String[] lines = line.split("@");
			if(lines.length==2){
				try {
					Date date = sdf.parse(lines[0]);
					Calendar calendar = Calendar.getInstance();
					calendar.setTime(date);
					int year = calendar.get(Calendar.YEAR);
					String hot = lines[1].substring(0, 2);
					KeyClass keyClass = new KeyClass();
					keyClass.setYear(year);
					keyClass.setHot(Integer.parseInt(hot));
					context.write(keyClass, value);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		
		
	}
	
	static class KeyReduce extends Reducer<KeyClass, Text, KeyClass, Text>{

		@Override
		protected void reduce(KeyClass key, Iterable<Text> value, Context context)
				throws IOException, InterruptedException {
			for(Text text:value){
				context.write(key, text);
				
			}
		}
		
	}
	
	public static void main(String[] args) throws Exception {
		Configuration configuration = new Configuration();
		Job job = Job.getInstance();
		job.setJobName("yearAndHot");
		job.setJarByClass(KeyMapReduce.class);
		job.setMapperClass(KeyMapper.class);
		job.setReducerClass(KeyReduce.class);
		
		job.setSortComparatorClass(KeySort.class);
		job.setPartitionerClass(KeyPart.class);
		job.setGroupingComparatorClass(KeyGroup.class);
		job.setNumReduceTasks(3);
		
		job.setOutputKeyClass(KeyClass.class);
		job.setOutputValueClass(Text.class);
		FileInputFormat.addInputPath(job, new Path("/test/data.txt"));
		FileOutputFormat.setOutputPath(job, new Path("/test/output"));
		
		System.exit(job.waitForCompletion(true)==true?0:1);
	}
}
資料:
2010-11-02 12:12:[email protected]℃ 
2010-11-03 11:11:[email protected]℃ 
2010-11-04 10:10:[email protected]℃ 
2011-11-02 12:12:[email protected]℃ 
2011-11-03 11:11:[email protected]℃ 
2011-11-04 10:10:[email protected]℃ 
2012-11-02 12:12:[email protected]℃ 
2012-11-03 11:11:[email protected]℃ 
2012-11-04 10:10:[email protected]℃ 
2012-11-05 10:00:[email protected]
輸出:
[[email protected] hadoop]$ hadoop fs -ls /test/output
Found 4 items
-rw-r--r--   1 hadoop supergroup          0 2017-06-27 15:53 /test/output/_SUCCESS
-rw-r--r--   1 hadoop supergroup        105 2017-06-27 15:52 /test/output/part-r-00000
-rw-r--r--   1 hadoop supergroup        105 2017-06-27 15:52 /test/output/part-r-00001
-rw-r--r--   1 hadoop supergroup        140 2017-06-27 15:52 /test/output/part-r-00002
[[email protected] hadoop]$ hadoop fs -cat /test/output/part-r-00000
2010,45	2010-11-02 12:12:[email protected]℃	
2010,40	2010-11-03 11:11:[email protected]℃	
2010,38	2010-11-04 10:10:[email protected]℃	
[[email protected] hadoop]$ hadoop fs -cat /test/output/part-r-00001
2011,56	2011-11-03 11:11:[email protected]℃	
2011,45	2011-11-02 12:12:[email protected]℃	
2011,34	2011-11-04 10:10:[email protected]℃	
^[[A[[email protected] hadoop]$ hadoop fs -cat /test/output/part-r-00002
2012,56	2012-11-03 11:11:[email protected]℃	
2012,54	2012-11-02 12:12:[email protected]℃	
2012,33	2012-11-04 10:10:[email protected]℃	
2012,23	2012-11-05 10:00:[email protected]

相關推薦

mapreduce定義排序分割槽分組實現按照年份升序排序溫度排序

自定義類: package myhadoop; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.Wr

利用List的sort方法定義比較器對類屬性進行排序

JDK1.8之後,List新增了sort方法,使用Comparator作為引數,呼叫者可自定義比較規則。 User user1 = new User(12, "張三"); User use

MapReduce 之 ---定義全域性計數器將資訊輸出到控制檯

package jishuqi; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.ha

Oracle 藉助DECODE函式定義順序排序

由於業務需求想根據自定義的ids排序 貼出部分程式碼 基於mybatisorder by decode (t.id, <foreach item="id" index="index" collection="ids" separato

C#/.net/WCF 使用DataMember Order 無視屬性自上而下的輸出順序定義Json輸出排序該方法大神也不一定會!

color json反序列 方法 write pre bject mar ets Coding 1 static void Main(string[] args) 2 { 3 Models m = new Models

jQuery基礎(鼠標事件表單事件鍵盤事件定義事件 篇)

1.7 傳遞 ret 文本 leave 右鍵 page content gree 1.jQuery鼠標事件之click與dbclick事件 方法一:$ele.click()(不帶參數) <div id="test">點擊觸發<div> $(

jQuery基礎(常用插件 表單驗證圖片放大鏡定義對象級jQuery UI面板折疊)

此外 cookie值 添加圖標 tor 列表 需要 droppable 使用 ddn 1.表單驗證插件——validate 該插件自帶包含必填、數字、URL在內容的驗證規則,即時顯示異常信息,此外,還允許自定義驗證規則,插件調用方法如下: $(form).vali

[php]微信測試號調取acces_token定義菜單以及被動響應消息

個人中心 res keyword environ 變量 pri exist ron 數據 1 <?php 2 /**自己寫的  */ 3 $wechatObj = new wechatCallbackapiTest(); 4 $wechatObj-&

iOS 根據字符串數目定義Label等控件的高度

rect 復制代碼 設置 高度 uifont ios oat size hsi 利用分類,NSString,增加一個方法。 #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @

XAF 框架中定義參數動作(Action)輸入參數的控件可定義用於選擇組織及項目

示例 app frame tro href express documents 定義 ron XAF 框架中,如何生成一個自定義參數動作(Action),輸入參數的控件可定義? 參考文檔:https://documentation.devexpress.com/eXpres

c++primer定義一個復數類

opera 指針 隨著 per call 拷貝構造函數 會銷 局部變量 eal 1 #include<iostream> 2 #include<string> 3 #include<vector> 4 #include<a

C# 更新控件四部曲定義的用戶控件無法更新怎麽辦

添加項 備份 如果 重新 目的 新的 用戶 c# 用戶控件 用戶控件如果在其他的項目被引用,希望更新控件後,所引用的項目同步更新效果,一開始難免失敗,特別是更換了控件所在的文件夾。 這個時候,四部曲來解決控件的更新。 1.運行一下控件的項目,使控件生成一下。 2.在要引用的

18)django-模板的過濾器和tag定義simple_tag和filter

hello 直接 結果 from simple 使用 span 裝飾 san 模板過濾器是在變量被顯示前修改它的值的一個簡單方法。 過濾器使用管道字符 . 模板標簽(template tag) 。標簽(tag)定義比較明確,即: 僅通知模板系統完成某些工作的標簽。 一:d

哈希表隊列集合棧集合定義函數

哈希 var 定義函數 each val ret htable 值類型 turn 1 1)哈希表 定義:(不規定長度,不規定類型,不規定鍵的類型) Hashtable ht=new hashtable(); (點擊

django 的模板語言template 定義過濾器定義標簽模板繼承

test block src view -- back def 其他 init 後端views文件傳來的字符串和對象,到前端頁面後需要進行渲染, {{ 變量 }}{{ 變量| filter:參數 }}filter可以有很多函數 {#對後端傳來的數據進行渲染,add 就是過濾

源碼包安裝和快捷的管理nginx定義命令管理服務

定義開啟服務的函數 編寫一個啟動腳本管理軟件 源碼包安裝與管理 服務函數 安裝線上的生產服務器軟件包時大多會用源碼安裝,這是因為源碼安裝可以選擇最新的軟件包,而Linux系統自帶的軟件包一般都是最穩定的版本,但不能保證是最新的。源碼安裝還可以自行調整編譯參數,最大化地定制安裝結果。相對而言,源

IntelliJ IDEA如何設置頭註釋定義author和date

技術分享 spa 分享圖片 es2017 log tel auth bsp image 下面這張圖,保證你一看就會: 下面這個模板,你拿去改一改就行了。 1 /** 2 * @Author: Gosin 3 * @Date: ${DATE} ${TIME} 4 */

css定義滾動條樣式定義文字選擇樣式設置文字不被選擇

sed 分享 play gpo radi https cal hid 右移 ::-webkit-scrollbar 滾動條整體部分 ::-webkit-scrollbar-thumb 滾動條裏面的小方塊,能向上向下移動(或往左往右移動,取決於是垂直滾動條還是水平滾動條)

模仿CyclicBarrier定義自己屏障類

on() exc urn oid lee rand () pri rup 簡介 在這裏模仿CyclicBarrier,自定義一個自己多線程屏障類,裏面有個計時器count,count為0時,才喚醒線程,否則就await掛起,(沒錯就是用的object類的掛起和喚醒全部線程方

微信開發——測試號申請接口配置JS接口安全域名定義菜單

acc contents term 集中 from 調試工具 AR 賬號 下載 1、申請測試賬號: 先申請公眾號後,點擊進入公從號的管理頁面;找到“開發者工具”,找到“公眾平臺測試賬號”,點擊“進入”。 2、接口配置信息設置 必須要外網哦,也就是微信服務器要能