如何在hadoop中使用自定义类型

gkl3eglg  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(411)

我正在尝试制作一个经典字数计算程序的修改版本,其中目标输出是输入文档的名称及其包含的唯一字数。
为了实现这一点,我计划使用一个自定义数据类型作为键,其中数据类型包含一个输入文件和一个单词的名称。ie:datastruct=[filename,word]。
我的计划是分两次完成,首先我将输入文件Map到(datastruct,1)键值对,然后将其减少到->(datastruct,count)。我设想每一行的格式如下:

..
file1 word 4
file2 word 6
..

然后我将执行另一个过程,其中map阶段生成(filename,1)对,reducer生成所需的(filename,count)输出。
我的第一个(也是次要的)问题是,这是否是解决这个问题的合理方法,因为网上没有太多的hadoop资料可供参考,所以我非常感谢在这个领域有经验的人能给我的任何建议。
我遇到的主要问题,以及我遇到的麻烦是,在我的第一阶段的输出。在我的代码中实现了下面的类之后,我期望得到所需的 file word count 但事实并非如此。

public static class DataStruct implements WritableComparable<DataStruct> {
        private Text word;
        private Text filename;

        public DataStruct(Text w, Text fn) {
            word = w;
            filename = fn;
        }

        public DataStruct() {
            word = new Text();
            filename = new Text();
        }

        public void set(Text w, Text fn) {
            word = w;
            filename = fn;
        }

        public Text getFilename() {
            return filename;
        }

        public Text getWord() {
            return word;
        }

        @Override
        public int compareTo(DataStruct d) {
            if(word.compareTo(d.word) == 0) {
                return filename.compareTo(d.filename);
            }
            else return word.compareTo(d.word);
        }

        @Override
        public boolean equals(Object o) {
            if(o instanceof DataStruct) {
                DataStruct other = (DataStruct) o;
                return word.equals(other.word) && filename.equals(other.filename);
            }
            else return false;
        }

        @Override
        public void readFields(DataInput in) throws IOException {
            word.readFields(in);
            filename.readFields(in);
        }

        @Override
        public void write(DataOutput out) throws IOException {
            word.write(out);
            filename.write(out);
        }

        @Override
        public int hashCode() {
            String combine = word.toString()+filename.toString();
            return combine.hashCode();
        }

    }

我的输出如下所示:

..
UniqueWordsDocument$DataStruct@a3cd2dd1 1
UniqueWordsDocument$DataStruct@1f6943cc 1
..

我在网上找不到任何解释。我已经知道@后面的值是数据的hashcode,但是如果输出中没有文件名和单词,我不知道如何继续。如果有人能解释这里发生了什么和/或如何解决这个问题,我将不胜感激。
谢谢你的帮助。

hjzp0vay

hjzp0vay1#

你需要覆盖 public String toString() 方法 DataStruct 班级。
从目前的情况来看,java不知道如何显示 DataStruct 对象,所以只打印对象本身的引用。
您可能希望拥有以下内容:

@Override
public String toString() {
    return word.toString() + "-" + filename.toString();
}

相关问题