天天看點

MapReduce應用開發

Hadoop資料類型

Hadoop基本資料類型如下:

  • IntWritable:整型數
  • LongWritable:長整型數
  • FloatWritable:浮點數
  • DoubleWritable:雙位元組數
  • BooleanWritable:布爾型
  • ByteWritable:單位元組,對應byte類型
  • BytesWritable:位元組數組,對應byte[]

Hadoop常用的其他資料類型如下:

  • Text:使用UTF8格式存儲的文本,對String類型的重寫
  • ObjectWritable:是一種對多類型的封裝,可以用于Java的基本類型,如String等,如同Java的Object類
  • NullWritable:是一個點位符,序列化長度為零,當<key,value>中的key或value為空時使用
  • ArrayWritable:針對數組的資料類型
  • MapWritable:對java.util.Map的實作

    Hadoop資料類型都實作了Writable接口,并且與Java類型之間可互相轉化。

1.Java類型轉Hadoop類型

// 方法1:

IntWritable num= new IntWritable(1);  
Text sss = new Text("hello world!");   
           

// 方法2

IntWritable num= new IntWritable();
num.set(2);
Text sss = new Text();
sss.set("hello world!"); 
           
2.Hadoop類型轉Java類型

對于Text類型

Text sss = new Text();
sss.set("hello world!");
sss.toString(); 
           

對于除了Text的類型

IntWritable aaa = new IntWritable(123);
aaa.get();
           

在Hadoop中,序列化處于核心地位。無論是存儲檔案還是在計算中傳輸資料,都需要執行序列化的過程。序列化與反序列化的速度、序列化後的資料大小都會影響資料傳輸的速度,以緻影響計算的效率。正是因為如此,Hadoop并沒有采用Java提供的序列化機制,而是重新寫了一套,由此所有的Hadoop基礎資料類型都實作了org.apache.hadoop.io.Writable接口。

Writable接口隻定義了兩個方法:

  • void write(java.io.DataOutput out); // 序列化輸出資料流
  • void readFields(java.io.DataInput input); // 序列化輸入資料流

下面我們使用Hadoop基本資料類型的使用,代碼如下。

import org.apache.hadoop.io.ArrayWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.MapWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;

public class HadoopDataType {

	// String
	public static void testString(){
		String s = "Hello Jiang Tao";
		System.out.println(s.length());
		System.out.println(s.indexOf("a"));
		System.out.println(s);
	}
	
	// Text
	public static void testText(){
		Text t = new Text("Hello Jiang Tao");
		System.out.println(t.getLength());
		System.out.println(t.find("a"));
		System.out.println(t.toString());
	}
	
	// ArrayWritable
	public static void testArrayWritable(){
		// 整形數組
		ArrayWritable arr = new ArrayWritable(IntWritable.class);
		// 整形
		IntWritable i = new IntWritable(2);
		IntWritable j = new IntWritable(3);
		IntWritable k = new IntWritable(4);
		// 将多個整形放入整形數組
		arr.set(new IntWritable[]{i,j,k});
		System.out.println(String.format("i=%d,j=%d,k=%d", 
			((IntWritable)arr.get()[0]).get(),
			((IntWritable)arr.get()[1]).get(),
			((IntWritable)arr.get()[2]).get()
		));
	}
	
	// MapWritable
	public static void testMapWritable(){
		// map
		MapWritable map = new MapWritable();
		// 字元串
		Text k1 = new Text("name");
		Text v1 = new Text("jason");
		Text k2 = new Text("password");
		// 填充map
		map.put(k1, v1);
		map.put(k2, NullWritable.get());
		System.out.println(map.get(k1).toString());
		System.out.println(map.get(k2).toString());
	}
	
	public static void main(String[] args) {
		testString();
		testText();
		testArrayWritable();
		testMapWritable();	
	}
}
           

以上代碼建立的項目是Java Project,需要使用的jar檔案有。

  • hadoop-common-2.6.5.jar
  • commons-collections-3.2.2.jar
  • commons-logging-1.1.3.jar
  • guava-11.0.2.jar

繼續閱讀