测试数据
1,2,1,1,1 1,2,2,1,1 1,3,1,1,1 1,3,2,1,1 1,3,3,1,1 1,2,3,1,1 1,3,1,1,1 1,3,2,1,1 1,3,3,1,1
目的
在map中数据以‘,’分隔,分隔后的前两列作为key,相同的key会被分到同一个reduce中。
配置参数说明
map.output.key.field.separator: map中key的分隔符 num.key.fields.for.partition: 指定前多少列(以分隔符分隔出的列)作为partition的依据,相同的会被分到同一个reduce中,如果没有分隔符或者分隔符数量少于指定书目的视key为整行,value为空 -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner 和上面两个配置项配合使用,否则没有效果
测试代码
#! /bin/bash #定义map和reduce的目录 export WORK_PATH=/var/tmp #执行stream的jar包地址 stream=$HADOOP_HOME/share/hadoop/tools/lib/hadoop-streaming-2.7.5.jar #数据输入目录 input=/lcy/wcount/input #输出结果目录 output=/lcy/wcount/output #删除mr输出目录 if $HADOOP_HOME/bin/hdfs dfs -test -d $output then $HADOOP_HOME/bin/hdfs dfs -rm -r $output fi #执行mapreduce程序 $HADOOP_HOME/bin/hadoop jar $stream \ -D map.output.key.field.separator=, \ -D num.key.fields.for.partition=2 \ -D mapreduce.job.reduces=2 \ -partitioner org.apache.hadoop.mapred.lib.KeyFieldBasedPartitioner \ -input $input/sort.txt \ -output $output \ -mapper "cat" \ -file "$WORK_PATH/mapper.py" \
输出结果
#前两列为1,3的被分到同一输出文件中 #part-00000 1,3,1,1,1 1,3,1,1,1 1,3,2,1,1 1,3,2,1,1 1,3,3,1,1 1,3,3,1,1
#前两列为1,2的倍分到同一文件中 #part-00001 1,2,1,1,1 1,2,2,1,1 1,2,3,1,1
参考博文
https://blog.csdn.net/bitcarmanlee/article/details/51881699
https://blog.csdn.net/bitcarmanlee/article/details/51882906