在map任务开始之前做一些事情

lymgl2op  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(238)

我目前正在使用hadoop处理一个大型数据集(大约3 Gig)的计数任务。我需要计算填充在同一时间段的内容。例如:计算时间标签在凌晨3点到凌晨4点之间的记录数。我需要输出是连续的,如果在某个时间段没有记录,我仍然希望在输出中保留它,比如[3am~4am,0个记录]。
为了实现这一点,我提出了一个想法,可以在map任务开始之前将值为0的所有时隙放入Map输出中。但我试过谷歌,却找不到解决办法。
那么,有没有什么方法可以在map任务开始之前输出一些东西呢?我也将感谢任何新的想法,以实现这一目标。谢谢

svujldwt

svujldwt1#

解决方法是在你的计数任务的同时进行,以节省时间。
假设您有以下文件/表
日期时间产品价值
2016年14:00,三星,100
2016,15:30,lg,130
2016年,15:59,nexus,50
2016,18:10,lg,15
你要按产品分组,找出每种产品的总数,但同时你要计算出时间标签在凌晨3点到4点之间的记录数
只需在Map器类中定义自定义键并将其发送到上下文,具体取决于您的条件

public class Mapper_WordsCount extends Mapper<LongWritable, Text, Text, IntWritable> {

    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    @Override
    public void map(LongWritable key, Text value, Context context)
            throws IOException, InterruptedException {

        String line = value.toString();
        String[] items = line.split(",")

        //define a custom key
        String myCustomKey = "3am-4am";

        //put 0 by default. Only if you want to have result like: [3am-4am, 0 records]
        context.write(new Text(myCustomKey),IntWritable(0));

        // check you condition
        if ( isBetween_3am_and_4am( items[1] ) ) {    //  write your function 
            //count the record like you want
            context.write(new Text(myCustomKey),one);
        }

        ......
        your java code
        ......

    }
}

相关问题