原文:http://wingmzy.iteye.com/blog/1260570
hadoop中的map-reduce是處理<key,value>這樣的鍵值對,故指定<key,value>的分割符等參數可以分成三類:
map輸出時分割符
分桶時的分隔符
reduce輸出時的分割符
下面分別敘述:
1. map輸出時分割符
參數:
stream.map.output.field.separator
作用:
指定map輸出時的分割符
stream.num.map.output.key.fields
指定輸出按照分隔符切割后,key所占有的列數
舉例:
input數據:
2,2,c,c,c,c
參數配置:
-mapper "cat" # map 為分布式的cat命令
-reducer "" #reduce為空 /
-jobconf stream.map.output.field.separator=',' /
-jobconf stream.num.map.output.key.fields=2 /
即按照','逗號分隔后,去前2列作為key
output數據:
2,2 c,c,c,c #其中key為2,2 value為c,c,c,c
2. 分桶時的分隔符
map.output.key.field.separator
指定map輸出<key,value>對之后,其中key內部的分割符
num.key.fields.for.partition
指定分桶時,按照分隔符切割后,用於分桶key所占的列數
舉例:
map的output數據:
2,2 c,c,c,c
參數配置:
-jobconf map.output.key.field.separator=',' /
-jobconf num.key.fields.for.partition='1' /
-partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner /
output數據:
這樣用於partition分桶的key就為:2
注意,這里分桶不應該用默認的HashPartitioner
3. reduce輸出時的分割符
這個與map類似,分別用於reduce輸出時分隔符以及key占有的列數
stream.reduce.output.field.separator
stream.num.reduce.output.key.fields
也可以通過代碼實現,如下
mapreduce 默認情況下 key/value 分隔符為:“\t”
測試的輸出如下:
我們可以在代碼中進行設置來自定義 key/value 輸出分隔符:在代碼中添加如下一行代碼:
conf.set("mapred.textoutputformat.separator", ";"); //此處以”;“作為分割符,后邊介紹為什么這么修改

修改代碼后,測試修改結果:

修改原因:
我們checkout hadoop-1.2.1版本
打開文件:TextOutputFormat.java

我們可以看到如下一行代碼:
String keyValueSeparator= conf.get("mapred.textoutputformat.separator",
"\t");
代碼的意思是:讀取設置的key/value輸出分隔符,如果沒有讀取到,默認使用 "\t"
所以我們就在任務執行前設置名稱為:mapred.textoutputformat.separator 的自定義值 即可
