GroupingComparator.txt

1、GroupingComparator.txt 输入数据

0000001 Pdt_01  222.8
0000002 Pdt_05  722.4
0000001 Pdt_05  25.8
0000003 Pdt_01  222.8
0000003 Pdt_01  33.8
0000002 Pdt_03  522.8
0000002 Pdt_04  122.4

2、part-r-00000.txt 输出数据

3   222.8

3、part-r-00001.txt 输出数据

2   722.4

4、part-r-00002.txt 输出数据

1   222.8
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MapReduce框架实现二次排序,具体步骤如下: 1. 自定义一个WritableComparable类,用于存储温度和时间戳两个属性,并实现compareTo方法,以便进行二次排序。 2. 自定义一个Mapper类,将输入的数据按照温度和时间戳分别作为key和value输出。 3. 自定义一个Partitioner类,根据key的温度属性将数据分发到不同的Reducer中。 4. 自定义一个GroupingComparator类,用于将相同温度的数据分到同一个组中,以便进行二次排序。 5. 自定义一个Reducer类,将同一温度下的数据按照时间戳进行排序,并输出结果。 完整代码如下: public class Temperature implements WritableComparable<Temperature> { private double temp; private long timestamp; public Temperature() {} public Temperature(double temp, long timestamp) { this.temp = temp; this.timestamp = timestamp; } @Override public void write(DataOutput out) throws IOException { out.writeDouble(temp); out.writeLong(timestamp); } @Override public void readFields(DataInput in) throws IOException { temp = in.readDouble(); timestamp = in.readLong(); } @Override public int compareTo(Temperature o) { int cmp = Double.compare(temp, o.temp); if (cmp != 0) { return cmp; } return Long.compare(timestamp, o.timestamp); } public double getTemp() { return temp; } public long getTimestamp() { return timestamp; } } public class TemperatureMapper extends Mapper<LongWritable, Text, Temperature, NullWritable> { private Temperature temperature = new Temperature(); @Override protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String[] fields = value.toString().split(","); double temp = Double.parseDouble(fields[0]); long timestamp = Long.parseLong(fields[1]); temperature = new Temperature(temp, timestamp); context.write(temperature, NullWritable.get()); } } public class TemperaturePartitioner extends Partitioner<Temperature, NullWritable> { @Override public int getPartition(Temperature key, NullWritable value, int numPartitions) { return (int) (key.getTemp() * 100) % numPartitions; } } public class TemperatureGroupingComparator extends WritableComparator { protected TemperatureGroupingComparator() { super(Temperature.class, true); } @Override public int compare(WritableComparable a, WritableComparable b) { Temperature t1 = (Temperature) a; Temperature t2 = (Temperature) b; return Double.compare(t1.getTemp(), t2.getTemp()); } } public class TemperatureReducer extends Reducer<Temperature, NullWritable, Text, NullWritable> { @Override protected void reduce(Temperature key, Iterable<NullWritable> values, Context context) throws IOException, InterruptedException { for (NullWritable value : values) { context.write(new Text(key.getTemp() + "," + key.getTimestamp()), NullWritable.get()); } } } 在Driver类中,需要设置自定义的WritableComparable类、Mapper类、Partitioner类、GroupingComparator类和Reducer类,并指定输入输出路径等参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值