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、接口配置信息設置 必須要外網哦,也就是微信服務器要能