如何获得演员和他们播放的电影数量和他们导演的电影数量?

33qvvth1  于 2021-05-27  发布在  Hadoop
关注(0)|答案(1)|浏览(476)

我正在为map和reduce编写代码,以便以后在hadoop上运行。我必须得到3列:
人员id,
他演过多少部电影,
他导演的电影数量
数据文件如下所示:
tconst(字符串)
标题的字母数字唯一标识符
排序(整数)
唯一标识给定标题ID行的数字
nconst(字符串)
姓名/人员的字母数字唯一标识符
类别(字符串)
此人所从事的工作类别
作业(字符串)
具体的职务(如果适用),否则为“\n”
字符(字符串)
播放的角色的名称(如果适用),否则为'\n'

我在前面的练习中对wordcount.java的代码做了一些修改。

public static class AvgSizeStationMapper extends
            Mapper<LongWritable, Text, Text, IntWritable> {

//        private Text year = new Text();
//        private IntWritable size = new IntWritable();
        private IntWritable size = new IntWritable();
        private Text category = new Text();

        public void map(LongWritable offset, Text lineText, Context context)

                throws IOException, InterruptedException {
            try {
                if (offset.get() == 0)
                    return;
                else {
                    String line = lineText.toString();
                    int i = 0;
                    for (String word : line
                            .split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)")) {
                        if (i == 4) {
                            year.set(word.substring(word.lastIndexOf('/') + 1,
                                    word.lastIndexOf('/') + 5));
                        }
                        if (i == 5) {
                            size.set(Integer.parseInt(word));
                        }
                        i++;
                    }
                    context.write(year, size);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static class AvgSizeStationReducer extends
            Reducer<Text, IntWritable, Text, DoubleWritable> {

        private DoubleWritable result = new DoubleWritable();
        Float average;
        Float count;
        int sum;

        @Override
        public void reduce(Text key, Iterable<IntWritable> values,
                           Context context) throws IOException, InterruptedException {
            average = 0f;
            count = 0f;
            sum = 0;

            Text sumText = new Text("average size of station for " + key
                    + " year is: ");

            for (IntWritable val : values) {
                sum += val.get();
                count += 1;
            }
            average = sum / count;
            result.set(average);
            context.write(sumText, result);
        }
     }

我如何做我的Map和缩小?

vlf7wbxs

vlf7wbxs1#

您仍在进行字数计算,因此应该删除减速机中的所有“平均”逻辑,只进行求和。
对于Map绘制者来说,要获得“演员时代, nconst “被看见了”

// TODO: Parse the line
if (category.equals("actor")) {
    context.write(nconst, 1);
}

对于“导演的电影数量”

// TODO: Parse the line
if (category.equals("director")) {
    context.write(nconst, 1);
}

这些可能是单独的Map器类,但是您可以使用相同的缩减器,因为逻辑是相同的
或者,只写一个 COUNT(*) ... GROUP BY nconst 在配置单元中查询

相关问题