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 的自定义值 即可

posted @ 2016-11-18 11:40  OnTheWay_duking  阅读(3936)  评论(0编辑  收藏  举报