hadoop 指定 key value分隔符


原文: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 的自定義值 即可


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM