022_Hadoop中的資料型別(Writable、WritableComparable、Comparator、RawComparator…)
1、 在hadoop中所有的key/value都必須實現Writable介面,有兩個方法,分別用於讀(反序列化)和寫(序列化)操作。
參考程式碼:
1 package org.dragon.hadoop.mapreduce.app; 2 3 import java.io.DataInput; 4 import java.io.DataOutput; 5 import java.io.IOException; 6 7 import org.apache.hadoop.io.Writable; 8 9 /** 10 * 11 * @author ZhuXY簡單繼承Writable例子 Code12 * @time 2016-3-10 下午3:49:55 13 * 14 */ 15 public class DataWritable implements Writable { 16 17 // telsphone 18 19 // upload 20 private int upPackNum; 21 private int upPayLoad; 22 23 // download 24 private int downPackNum; 25 private int downPayLoad; 26 27public DataWritable() { 28 29 } 30 31 public void set(int upPackNum, int upPayLoad, int downPackNum, 32 int downPayload) { 33 this.upPackNum = upPackNum; 34 this.upPayLoad = upPayLoad; 35 this.downPackNum = downPackNum; 36 this.downPayLoad = downPayload;37 38 } 39 40 public int getUpPackNum() { 41 return upPackNum; 42 } 43 44 public int getUpPayLoas() { 45 return upPayLoad; 46 } 47 48 public int getDownPackNum() { 49 return downPackNum; 50 } 51 52 public int getDownPayload() { 53 return downPayLoad; 54 } 55 56 @Override 57 public void write(DataOutput out) throws IOException { 58 out.writeInt(upPackNum); 59 out.writeInt(upPayLoad); 60 out.writeInt(downPackNum); 61 out.writeInt(downPayLoad); 62 } 63 64 /** 65 * 讀出的順序要和寫入的順序相同 66 */ 67 @Override 68 public void readFields(DataInput in) throws IOException { 69 // TODO Auto-generated method stub 70 this.upPackNum = in.readInt(); 71 this.upPayLoad = in.readInt(); 72 this.downPackNum = in.readInt(); 73 this.downPayLoad = in.readInt(); 74 } 75 76 @Override 77 public String toString() { 78 return upPackNum + "\t" + upPayLoad + "\t" + downPackNum + "\t" 79 + downPayLoad; 80 } 81 82 @Override 83 public int hashCode() { 84 final int prime = 31; 85 int result = 1; 86 result = prime * result + downPackNum; 87 result = prime * result + downPayLoad; 88 result = prime * result + upPackNum; 89 result = prime * result + upPayLoad; 90 return result; 91 } 92 93 @Override 94 public boolean equals(Object obj) { 95 if (this == obj) 96 return true; 97 if (obj == null) 98 return false; 99 if (getClass() != obj.getClass()) 100 return false; 101 DataWritable other = (DataWritable) obj; 102 if (downPackNum != other.downPackNum) 103 return false; 104 if (downPayLoad != other.downPayLoad) 105 return false; 106 if (upPackNum != other.upPackNum) 107 return false; 108 if (upPayLoad != other.upPayLoad) 109 return false; 110 return true; 111 } 112 113 }
2、所有的key必須實現Comparable介面,在MapReduce過程中需要對Key/Value對進行反覆的排序。預設情況下依據Key進行排序的,要實現comparaTo()方法。所以通過Key既要實現Writable介面又要實現Comparable介面,Hadoop中提供了一個公共的介面,叫做WritableComparable介面:
3、由於需要序列化反序列化和進行比較,對java物件需要重寫一下幾個方法:
① equals();
② hashCode();
③ toString()方法
如IntWritable型別的實現:
1 package org.apache.hadoop.io; 2 3 import java.io.*; 4 5 /** A WritableComparable for ints. */ 6 public class IntWritable implements WritableComparable { 7 private int value; 8 9 public IntWritable() {} 10 11 public IntWritable(int value) { set(value); } 12 13 /** Set the value of this IntWritable. */ 14 public void set(int value) { this.value = value; } 15 16 /** Return the value of this IntWritable. */ 17 public int get() { return value; } 18 19 public void readFields(DataInput in) throws IOException { 20 value = in.readInt(); 21 } 22 23 public void write(DataOutput out) throws IOException { 24 out.writeInt(value); 25 } 26 27 /** Returns true iff <code>o</code> is a IntWritable with the same value. */ 28 public boolean equals(Object o) { 29 if (!(o instanceof IntWritable)) 30 return false; 31 IntWritable other = (IntWritable)o; 32 return this.value == other.value; 33 } 34 35 public int hashCode() { 36 return value; 37 } 38 39 /** Compares two IntWritables. */ 40 public int compareTo(Object o) { 41 int thisValue = this.value; 42 int thatValue = ((IntWritable)o).value; 43 return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1)); 44 } 45 46 public String toString() { 47 return Integer.toString(value); 48 }View Code
4、資料型別,必須有一個無參的構造方法,為了方便反射建立物件。
在自定義資料型別中,建議使用java原生資料型別,最好不要使用hadoop對原生型別封裝好的資料型別,即如下樣例程式碼:
推薦使用:
相關推薦
022_Hadoop中的資料型別(Writable、WritableComparable、Comparator、RawComparator…)
1、 在hadoop中所有的key/value都必須實現Writable介面,有兩個方法,分別用於讀(反序列化)和寫(序列化)操作。 參考程式碼: 1 package org.dragon.hadoop.mapreduce.app; 2 3 import java.io.DataInput
mysql 資料型別 (最大值 和 最小值)
1、整型 MySQL資料型別 含義(有符號) tinyint(m) 1個位元組 範圍(-128~127) smallint(m) 2個位元組 範圍(-32768~32767) mediumint(m) 3個位元組 範圍(-8388608
python 中資料型別--列表、元組的理解(一)
資料型別--列表、元組 一、列表 list 數值 score=80 字串 name1="tom" name2="jerry" name3="kate" 當需要儲存多個元素的
C/C++ 指標小結——指標與其它資料型別(陣列、字串、函式、結構體)的關係
一、指標與陣列和字串 1、指標與陣列 當宣告數時,編譯器在連續的記憶體空間分配基本地址和足夠的儲存空間,以容納陣列的所有元素。基本地址是陣列第一個元素(索引為0)的儲存位置。編譯器還把陣列名定義為指向第一個元素的常量指標。 元素的地址是通過索引和資料型別的比例因子來計算的;例如: x[3
Python自動化學習筆記(四)——Python資料型別(集合set,元組tuple)、修改檔案、函式、random常用方法
1.修改檔案的兩種方式 1 #第一種 2 with open('users','a+') as fw: #用a+模式開啟檔案,使用with這種語法可以防止忘記close檔案 3 fw.seek(0) #移動檔案指標到最前面,然後才能讀到內容 4 result=fw.read()
3)java基本資料型別(常量、轉換)
java基本資料型別 變數的作用:申請記憶體來儲存值。(申請什麼型別的變數就只能儲存什麼型別的變數) java兩大資料型別: 內建資料型別 引用資料型別 內建資料型別 共8種 6種數字型別(四個整型、兩個浮點型) 1
Javascript高階程式設計學習筆記(三)—— JS中的資料型別(1)
前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不
弄懂進位制、bit、java基本資料型別(byte、short、int 、char 、String)、ASCII、Unicode、UTF-8、UTF-16的關聯關係及UTF-8、UTF-16編碼原理
首先普及一下基本概念: 1.數值(百度百科):指的是用數目表示的一個量的多少; 2.進位制(百度百科):也就是進位計數制,是人為定義的帶進位的計數方法。對於任何一種進位制---X進位制,就表示每一位置上的數運算時都是逢X進一位。 十進位制是逢十進一,十六進位制是逢十六進一,二進位制就是逢二進
Python從零開始系列連載(18)——Python特色資料型別(函式)(中)
無返回值的函式 之前說了好多,都是有返回值的函式,那有沒有沒返回值的函式呢? 這個可以有! 函式中變數的作用域 變數的作用域就是在程式中能對這個變數操作的區域範圍 有點像初高中學的函式的定義域 Python允許同名變數的出現
【Python學習記錄——從入門到放棄】一、變數和簡單資料型別(上)
本文使用的書籍是《Python程式設計:從入門到實踐》 本文使用的是Python3.6 一、執行hello_world.py 這裡主要是演示了一下print函式的使用,新手主要是在Python版本與print函式上有出入,導致出錯。 還有就是在“中文雙引號”和"英文雙
【Python學習記錄——從入門到放棄】一、變數和簡單資料型別(下)
本文使用的書籍是《Python程式設計:從入門到實踐》 本文使用的是Python3.6 四、數字 在Python中,數字分為整數型和浮點型,不管是整數型還是浮點型都適用於加(+)減(-)乘(*)除(/)。 並且,在Python中,乘方是使用符號**來表示的,求餘數使用
Python基本資料型別(數字、字串、列表、元組、集合、字典)
Python基本資料型別: 數字 字串(‘ ‘ 或 “ “括起來;不可修改;可切片或下標檢索) 列表[ ] (可修改;可切片或下標檢索) 元組( ) (不可修改;可切片或下標檢索) 集合{ } (無法修改,只能增刪) 字典{ } (只能改值,不能改鍵;用鍵
在Talend 的tMap元件中資料型別轉換函式總結(一)
1.1 字串與數值型別相互轉換 1.1.1 字串轉為浮點型、整形 1)Float.parseFloat(row3.working_time ) Float.valueOf(String s) Float.valueOf(int s) 2)Integer.pars
結合案例講解MapReduce重要知識點 ----------- 自定義MapReduce資料型別(1)重寫Writable介面
重寫Writable介面 如下程式碼就是自定義mr資料型別,在wordcount類使用它。 WordCountWritable import java.io.DataInput; import java.io.DataOutput; import java.io.IOE
二、python 數值型別(字串切片)和資料型別(元組)
linux下 可以安裝python工具;yum install -y ipython ipython支援 命令補全 數值型別 數值型別分為整形 ,長整形,浮點型,複數行 整形:平常使用的整數 長整型:很大的整數。 type 為 long 浮點:帶小數點的數字 想
Python入門——Python變數和資料型別—— Python中布林型別(3-9)
我們已經瞭解了Python支援布林型別的資料,布林型別只有True和False兩種值,但是布林型別有以下幾種運算:與運算:只有兩個布林值都為 True 時,計算結果才為 True。True and True # ==> True True and False #
javascript中判斷資料型別的四種方法及typeof、instanceof、constructor、toString
在 ECMAScript 規範中,共定義了 6種資料型別,分為 基本型別 和 引用型別 兩大類,如下所示: 基本型別(簡單型別):String、Number、Boolean、Undefined、Null 。由於其佔據空間固定,是簡單的資料段,為了便於提升變數查
JS中六種資料型別(一)——Undefined
轉載自:http://blog.csdn.net/a2296096931/article/details/51072448 侵刪 JS中有6種資料型別:Undefined、Null、Boolean、Number、String和Object。JS中不支援任何建立自定義型別
引用資料型別(Scanner類、Random類)
Scanner類 Scanner類是引用資料型別的一種,我們可以使用該類來完成使用者鍵盤錄入,獲取到錄入的資料。 引用資料型別的使用 與定義基本資料型別變數不同,引用資料型別的變數定義及賦值有一個相對固定的步驟或格式。 資料型別 變數名 = ne
JS中六種資料型別(五)——String
String型別用於表示由零或多個16位Unicode字元組成的字元序列,即字串。字串可以由雙引號(“)或單引號(‘)表示,因此下面兩種字串的寫法都是有效的: var firstNam