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