Hadoop中自定义Partitioner,但是不同的key仍然在一个输出文件中

问题描述:

在自定义Partitioner的时候,想要实现一个简单的功能:将对应的key为“short”、“right”和“long”的分别存储在3个文件中。因为默认是存储在一个文件中,所以需要自定义Partitioner。

在实现功能的时候,想要通过判断key的值来决定result,代码如下:

      public int getPartition(Text key, Text value, int numPartition) {
		// TODO Auto-generated method stub
		int result = 1;
		if(key.equals("short")){
			result = 0 % numPartition;   //part-r-00000
		}else if(key.equals("right")){
			result = 1 % numPartition;   //part-r-00001
		}else if(key.equals("long")){
			result = 2 % numPartition;   //part-r-00002
		}	
		return result;
	}

但是不同的key对应的输出结果仍然在一个文件中,刚开始以为是mapreduce函数的问题,后来经过各种检查,发现问题是出现在自定义Partitioner,结果会将其输出到result初始化的那个值中,即if后面的判断语句结果一直是false。

问题原因:

因为key的类型是Text类型,而key.equals("short")中的"short"是String类型。所以即使key的值是“short”,key.equals("short")的结果仍然是false,因为类型不匹配。

问题解决:

将判断语句改成key.toString().equals("short"),这样就将Text类型的key,先转化成String类型再做比较,这样可以很好地满足我们的需求。

总结:

有些value我们直接看可能是相同的,但是若类型不一样,代码就会认为其不是同一个值。

 

附:Hadoop入门基础及简单实例代码:https://github.com/Nana0606/hadoop_example

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值