1. 程式人生 > >hadoop學習之HDFS(2.4):hadoop資料型別與java資料型別的對比與轉換

hadoop學習之HDFS(2.4):hadoop資料型別與java資料型別的對比與轉換

前言:

  hadoop由各個節點構成一個叢集,分散式儲存就要考慮到資料在節點之間來回傳遞的問題。為了解決這一問題,hadoop採用了java中的序列化和反序列化概念。序列化(serialization)是指將結構化的物件轉化為位元組流,以便在網路上傳輸或者寫入到硬碟進行永久儲存;相對的反序列化(deserialization)是指將位元組流轉回到結構化物件的過程。Hadoop中,位於org.apache.hadoop.io包中的Writable介面是Hadoop序列化格式的實現。

1,Writable介面實現了很多hadoop資料型別,它們將java的基本資料型別和一些常用的類(如字串,陣列,集合等)序列化,然後在節點之間傳遞,然後在目的地反序列化。可以把它們看作是java基本型別的封裝。下面是hadoop的常用資料型別與java資料型別之間的對應關係:

hadoop資料型別      <------------>  java資料型別:
布林型:
BooleanWritable     <------------>  boolean
整型:
ByteWritable        <------------>  byte
ShortWritable       <------------>  short
IntWritable         <------------>  int
LongWritable        <------------>   long
浮點型:
FloatWritable       <------------>  float
DoubleWritable      <------------>  double
字串(文字):
Text                <------------>  String
陣列:
ArrayWritable       <------------>  Array
map集合:
MapWritable         <------------>  map

2,相互轉換的方法:

(1),java資料型別轉換成hadoop資料型別:

第一種方法:

IntWritable aaa = new IntWritable(123);//將java的int型變數123封裝成hadoop的整型類IntWritable的物件。
Text sss = new Text("hello world!"); //同理,將java的String型別字串封裝成hadoop的文字類Text的物件。

第二種方法:

Text sss = new Text();
sss.set(“hello world!”); //Text物件sss呼叫set(String str)方法,將傳入的java String型別的字串轉化成Text型別。

(2),hadoop資料型別轉換成java資料型別

對於Text型別:

Text sss = new Text();
sss.set(“hello world!”);
sss.toString(); //Text類物件呼叫toString方法即轉換成java String類

對於除了Text的型別:

IntWritable aaa = new IntWritable(123);
aaa.get(); //除了Text類物件呼叫toString方法外,其餘hadoop資料型別要呼叫get()方法來轉換成相應的java資料型別。

3,hadoop資料型別的使用例子:

package com.jimmy.dataType;

import java.util.Set;
import org.apache.hadoop.io.*;

import jdk.internal.org.objectweb.asm.tree.analysis.Value;


public class test1 {
	public static void main(String[] args) {
		//例項化一個IntWritable物件,傳入java的整型作為引數,呼叫對應的建構函式
		IntWritable i1 = new IntWritable(1);
		System.out.println(i1);//直接輸出物件就會呼叫toString()方法。
		
		//例項化空參的IntWritable物件,然後呼叫set()方法賦值。
		IntWritable i2 = new IntWritable();
		i2.set(2);//將java整型設定為IntWritable型數值
		System.out.println(i2);//對於基本型別,直接輸出物件和呼叫get()方法效果一樣。
		System.out.println(i2.get());//get()方法返回java的整型數值。
		
		//例項化布林型別物件 
		BooleanWritable bb = new BooleanWritable(true);
		System.out.println(bb);
		System.out.println(bb.get());
		
		//在例項化ByteWritable和ShortWritable物件時,傳入的java整型要強制轉型為byte和short型。
		ByteWritable bw = new ByteWritable((byte)7);
		System.out.println(bw);
		ShortWritable sw = new ShortWritable((short)321);
		System.out.println(sw);
		
		//例項化LongWritable物件時,則不需要強制型別轉換。
		LongWritable ll = new LongWritable(123);
		System.out.println(ll);
		
		//例項化FloatWritable物件時,傳入的java浮點型數值要麼在後面加個f,要麼強制轉換為float型。
		FloatWritable fw = new FloatWritable((float)123.321);
		FloatWritable fw1 = new FloatWritable(123.321f);
		System.out.println(fw);
		System.out.println(fw1);
		
		//例項化DoubleWritable物件時,無需對傳入的數值做變換。
		DoubleWritable dw = new DoubleWritable(123.456);
		System.out.println(dw);
		
		//例項化Text物件時,  傳入java字串
		Text ss = new Text("hello");
		System.out.println(ss);//Text類沒有get()方法,因為直接輸出的就是字串
		System.out.println(ss.getLength());
		
		//ArrayWritable類對應於java的陣列,用於儲存hadoop的資料型別
		//在初始化ArrayWritable類物件時,要指定陣列中資料的型別,這裡ArrayWritable的建構函式使用反射原理獲得引數型別的Class類物件
		//set()方法接收一個hadoop資料型別的陣列
		ArrayWritable aa = new ArrayWritable(IntWritable.class);
		aa.set(new IntWritable[]{new IntWritable(1),new IntWritable(2),new IntWritable(3)});
		for(IntWritable i:(IntWritable[])aa.get()) //陣列中是Writable()型變數,get後要向下轉型到具體型別。
			System.out.println(i.get());
		//例項化一個ArrayWritable類物件,數組裡面是Text型別。
		ArrayWritable aa1 = new ArrayWritable(Text.class);
		aa1.set(new Text[]{new Text("lala"),new Text("haha"),new Text("xixi")});
		for(Text tt:(Text[])aa1.get())
			System.out.println(tt);
		//也可以呼叫相應的建構函式,直接生成一個ArrayWritable陣列
		ArrayWritable aa2 = new ArrayWritable(Text.class, new Text[]{new Text("tingsong"),new Text("love"),new Text("ziwei")});
		for(Text tt:(Text[])aa2.get())
			System.out.println(tt);
		
		//ArrayWritable的建構函式也可以直接接收一個java的String陣列,從而構造一個ArrayWritable陣列
		String[] strings = new String[]{"lala","haha","xixi"};
		ArrayWritable aa3 = new ArrayWritable(strings);
		String[] strings2 = aa3.toStrings();
		for(int i=0;i<strings2.length;i++)
			System.out.println(strings2[i]);
		
		//MapWritable類相當於java中的map集合,儲存鍵值對。
		//首先生成一個MapWritable物件,然後向該物件中新增鍵值對
		MapWritable mm = new MapWritable();
		mm.put(new Text("name"), new Text("jimmy"));
		mm.put(new Text("name1"), new Text("tom"));
		mm.put(new Text("name2"), new Text("jerry"));
		mm.put(new Text("name3"), new Text("angela"));
		System.out.println(mm.containsKey(new Text("name"))); //判斷有無相應的key
		System.out.println(mm.containsValue(new Text("jimmy"))); //判斷有無相應的value
		System.out.println(mm.get(new Text("name"))); //get()方法根據傳入的key值,返回其value
		Set<Writable> keys = mm.keySet(); //keySet()返回一個java的Set集合,集合中儲存Writable型物件。
		for(Writable ww:keys)
			System.out.println(mm.get(ww));
	}
}