1. 程式人生 > >022_Hadoop中的資料型別(Writable、WritableComparable、Comparator、RawComparator…)

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
12 * @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 27
public 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 }
複製程式碼 簡單繼承Writable例子 Code

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資料型別WritableWritableComparableComparatorRawComparator

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()

3java基本資料型別常量轉換

java基本資料型別 變數的作用:申請記憶體來儲存值。(申請什麼型別的變數就只能儲存什麼型別的變數) java兩大資料型別: 內建資料型別 引用資料型別 內建資料型別 共8種 6種數字型別(四個整型、兩個浮點型) 1

Javascript高階程式設計學習筆記—— JS資料型別1

 前一段時間由於事情比較多,所以筆記耽擱了一段時間,從這一篇開始我會盡快寫完這個系列。 文章中有什麼不足之處,還望各位大佬指出。 JS中的資料型別 上一篇中我寫了有關JS引入的Script標籤相關的東西。 那麼這一篇,我們可以正式進入JS的世界了,emmm 前面的東西應該比較基礎,大佬們不

弄懂進位制bitjava基本資料型別byteshortint char StringASCIIUnicodeUTF-8UTF-16的關聯關係及UTF-8UTF-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判斷資料型別的四種方法及typeofinstanceofconstructortoString

在 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