您好,登錄后才能下訂單哦!
小編給大家分享一下Hadoop中如何自定義,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
自定義計數器
計數器用來監控,hadoop中job的運行進度和狀態。
如源文件內容為:
a b
c d e f
g h i
現在需要找出字段數大于3和小于3的記錄條數,可以使用計數器來實現,代碼如下:
public void map(LongWritable key, Text value,
OutputCollector<Text, Text> output, Reporter reporter)
throws IOException {
String[] split = value.toString().split("\t");
if(split.length>3){
org.apache.hadoop.mapred.Counters.Counter counter = reporter.getCounter("MyCounter", "isLong");
counter.increment(1);
}else if(split.length<3){
org.apache.hadoop.mapred.Counters.Counter counter = reporter.getCounter("MyCounter","isShort");
counter.increment(1);
}
2. hadoop中的自定義數據類型
hadoop中默認的數據類型有:
BooleanWritable:標準布爾型數值
ByteWritable:單字節數值
DoubleWritable:雙字節數值
FloatWritable:浮點數
IntWritable:整型數
LongWritable:長整型數
Text:使用UTF8格式存儲的文本
NullWritable:當<key, value>中的key或value為空時使用
自定義數據類型的實現:
1.實現Writable接口,并重寫內部write()和readFields()方法,從而完成序列化之后的網絡傳輸和文件輸入或輸出。
2.如果該數據類型被作為mapreduce中的key,則該key需要為可比較的,需要實現WriableComparable接口,并重寫內部write()和readFields()、compare()方法。
代碼如下:
代碼一:
public class Person implements Writable{
long id;
String name;
long age;
@Override
public void readFields(DataInput in) throws IOException {
this.id = in.readLong();
this.name = in.readUTF();
this.age = in.readLong();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(id);
out.writeUTF(name);
out.writeLong(age);
}
@Override
public String toString() {
return "id:"+id+" name:"+name+" age:"+age;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public long getAge() {
return age;
}
}
代碼二:基于key的比較
package cn.com.bonc.hadoop;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
public class PersonSortByAge implements WritableComparable<PersonSortByAge>{
long id;
String name;
long age;
@Override
public void readFields(DataInput in) throws IOException {
in.readLong();
in.readUTF();
in.readLong();
}
@Override
public void write(DataOutput out) throws IOException {
out.writeLong(id);
out.writeUTF(name);
out.writeLong(age);
}
@Override
public int compareTo(PersonSortByAge o) {
return (int) (this.id - o.id);
}
@Override
public String toString() {
return "id:"+id+" name:"+name+" age:"+age;
}
}
以上是“Hadoop中如何自定義”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。