日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hadoop使用MultipleOutputs输出多文件或者指定命名

發布時間:2024/1/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hadoop使用MultipleOutputs输出多文件或者指定命名 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Hadoop使用MultipleOutputs輸出多文件或者指定命名

@(HADOOP)[hadoop]

(一)輸出多文件(未測試)

比如將不同國家的信息分別輸出到一份對應的文件中。

1、在reduce或map類中創建MultipleOutputs對象,將結果輸出

class reduceStatistics extends Reducer<Text, IntWritable, Text, IntWritable>{ //將結果輸出到多個文件或多個文件夾 private MultipleOutputs<Text,IntWritable> mos; //創建對象 protected void setup(Context context) throws IOException,InterruptedException { mos = new MultipleOutputs<Text, IntWritable>(context); } //關閉對象 protected void cleanup(Context context) throws IOException,InterruptedException { mos.close(); } }

2、在map或reduce方法中使用MultipleOutputs對象輸出數據,代替congtext.write()
Java代碼 收藏代碼

protected void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { IntWritable V = new IntWritable(); int sum = 0; for(IntWritable value : values){ sum = sum + value.get(); } System.out.println("word:" + key.toString() + " sum = " + sum); V.set(sum); //使用MultipleOutputs對象輸出數據 if(key.toString().equals("hello")){ mos.write("hello", key, V); }else if(key.toString().equals("world")){ mos.write("world", key, V); }else if(key.toString().equals("hadoop")){ //輸出到hadoop/hadoopfile-r-00000文件 mos.write("hadoopfile", key, V, "hadoop/"); } }

3、在創建job時,定義附加的輸出文件,這里的文件名稱與第二步設置的文件名相同
Java代碼 收藏代碼

//定義附加的輸出文件 MultipleOutputs.addNamedOutput(job,"hello",TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,"world",TextOutputFormat.class,Text.class,IntWritable.class); MultipleOutputs.addNamedOutput(job,"hadoopfile",TextOutputFormat.class,Text.class,IntWritable.class);

(二)指定輸出命名

1、創建變量

private static MultipleOutputs<Text, Text> mos;

2、初始化變量

在map或者reduce的setup()方法中初始化變量

mos = new MultipleOutputs<Text, Text>(context);

3、使用變量代替context來write

在map()或者reduce()方法中使用mos作輸出:

mos.write("outputname", key, new Text(""));

4、關于變量傳遞

在主類中定義的變量,如定義了一個outputname,需要將其寫入conf分發至其它nodemanager:

Configuration conf = new Configuration();//需要將變量分發至所有的nodemanagerconf.set("outputname", outputName);

然后在map/reduce中從context獲取這個變量:

context.getConfiguration().get("outputname")

5、關于part-**的輸出

使用multioutput改變了默認的輸出名稱后,原有的part-**也會輸出的,此時需要加上:

import org.apache.hadoop.mapreduce.lib.output.LazyOutputFormat; LazyOutputFormat.setOutputFormatClass(job, TextOutputFormat.class);

這將在有內容寫入文件時才創建文件,詳細可看:http://stackoverflow.com/questions/14555313/renaming-part-files-in-hadoop-map-reduce
另外,即使不使用multiOutput,如果任務輸出中有大量的空文件,也應加上這代碼。x

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Hadoop使用MultipleOutputs输出多文件或者指定命名的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。